Обычно лучше сохранять даты и время в формате mysql, в противном случае он получает гораздо больший код:
Ваш текст необходимо преобразовать в даты, снова получить в секундах и, наконец, вернуться к удобочитаемое время
Сначала идет версия mysql с тегом false, а ниже вы найдете версию SQL SERVER, которая является более сложной
SELECT
SEC_TO_TIME(SUM(TIMESTAMPDIFF(SECOND,STR_TO_DATE(`wrk_Start`,'%d-%m-%Y %k:%i:%s')
,STR_TO_DATE(`wrk_End`,'%d-%m-%Y %k:%i:%s'))
- TIME_TO_SEC(`wrk_Pause`)))
FROM
worktime;
Схема (MySQL v5.7)
CREATE TABLE worktime (
`wrk_Start` VARCHAR(19),
`wrk_End` VARCHAR(19),
`wrk_Pause` Time
);
INSERT INTO worktime
(`wrk_Start`, `wrk_End`, `wrk_Pause`)
VALUES
('01-04-2020 10:00:00', '01-04-2020 18:00:00', '00:00:00'),
('03-04-2020 10:00:00', '03-04-2020 17:30:00', '00:30:00'),
('06-04-2020 12:00:00', '06-04-2020 14:00:00', '00:00:00'),
('12-04-2020 09:00:00', '12-04-2020 16:50:00', '00:30:00');
Запрос № 1
SELECT
SEC_TO_TIME(SUM(TIMESTAMPDIFF(SECOND,STR_TO_DATE(`wrk_Start`,'%d-%m-%Y %k:%i:%s')
,STR_TO_DATE(`wrk_End`,'%d-%m-%Y %k:%i:%s'))
- TIME_TO_SEC(`wrk_Pause`)))
FROM
worktime;
| SEC_TO_TIME(SUM(TIMESTAMPDIFF(SECOND,STR_TO_DATE(`wrk_Start`,'%d-%m-%Y %k:%i:%s')
,STR_TO_DATE(`wrk_End`,'%d-%m-%Y %k:%i:%s'))
- TIME_TO_SEC(`wrk_Pause`))) |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 24:20:00 |
Просмотр на БД Fiddle
SQL СЕРВЕР
CREATE TABLE worktime (
wrk_Start nvarchar(19),
wrk_End nvarchar(19),
wrk_Pause nvarchar(8)
);
INSERT INTO worktime
(wrk_Start, wrk_End, wrk_Pause)
VALUES
('01-04-2020 10:00:00', '01-04-2020 18:00:00', '00:00:00'),
('03-04-2020 10:00:00', '03-04-2020 17:30:00', '00:30:00'),
('06-04-2020 12:00:00', '06-04-2020 14:00:00', '00:00:00'),
('12-04-2020 09:00:00', '12-04-2020 16:50:00', '00:30:00');
GO
4 rows affected
SELECT
(SUM(DATEDIFF(second,CONVERT(DATETIME,[wrk_Start]),
CONVERT(DATETIME,[wrk_End])) -
DATEDIFF(second,'00:00:00',[wrk_Pause]))) wrktime
FROM
worktime;
GO
| wrktime |
| ------: |
| 87600 |
DECLARE @seconds AS int = 896434;
SELECT CONVERT(varchar, (SUM(DATEDIFF(second,CONVERT(DATETIME,[wrk_Start]),
CONVERT(DATETIME,[wrk_End])) -
DATEDIFF(second,'00:00:00',[wrk_Pause]))) / 86400 ) + ':' + -- Days
CONVERT(varchar, DATEADD(ms, ( (SUM(DATEDIFF(second,CONVERT(DATETIME,[wrk_Start]),
CONVERT(DATETIME,[wrk_End])) -
DATEDIFF(second,'00:00:00',[wrk_Pause]))) % 86400 ) * 1000, 0), 108)
as "orktime"
FROM
worktime;
GO
| orktime |
| :--------- |
| 1:00:20:00 |
дБ <> скрипка здесь