Мне нужно сложить время работы вместе, и через 10 часов я понятия не имею, как мне это сделать. Таблицы выглядят так:

adrID    wrk_Start                      wrk_End                         wrk_Pause
10       01-04-2020 10:00:00            01-04-2020 18:00:00             00:00:00
10       03-04-2020 10:00:00            03-04-2020 17:30:00             00:30:00
10       06-04-2020 12:00:00            06-04-2020 14:00:00             00:00:00
10       12-04-2020 09:00:00            12-04-2020 16:50:00             00:30:00

Результат должен быть: 23:30, мой 5:00:27

Код работает, только если я использую небольшие интервалы, такие как 10.04.2020 - 12.04.2020, и когда я использую большие интервалы или интервалы, которые есть в будущем (сегодня у нас 17.04, и я использую, например, 10.04 - 20.04), не работает.

DECLARE @FromDate DATETIME = '01-04-2020 10:00:00';
DECLARE @ToDate DATETIME = '20-04-2020 17:00:00';
DECLARE @user INT = 10;
select convert(varchar, DATEADD(ss, sum(isnull(datediff(second, wrk_Start, wrk_End), 0)), 0), 108)
                from worktime
                where
                wrk_adrID = @wrk_Name and
                wrk_Start >= @wrk_FromDate and
                wrk_End <= @wrk_ToDate

1
catalin365 17 Апр 2020 в 18:23

2 ответа

Как правило, лучше сохранять даты и время в формате mysql, в противном случае получается гораздо больше кода:

Ваш текст должен быть преобразован в даты с снова добраться до секунд и, наконец, вернуться к удобочитаемому времени.

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

0
nbk 17 Апр 2020 в 15:54

Во-первых, не пытайтесь преобразовать значение обратно во время - SQL Server не допускает времени, превышающего 24 часа.

Я бы пошел на десятичные часы. Это было бы:

select adrid,
       (sum(datediff(second, wrk_start, wrk_end))-
        sum(datediff(second, '00:00:00', wrk_pause))
       )  / (60.0 * 60) as decimal_hours
from worktime
group by adrid;

Вот скрипка db <>.

0
Gordon Linoff 17 Апр 2020 в 16:00