2015-08-17 3 views
1

Я пытаюсь написать запрос, который преобразует поле длительности в секундах, а затем суммирует длительность в зависимости от времени и дня.SQL Sum продолжительность по часам и дням

Продолжительность - это время, в течение которого «событие» выполнялось в течение часа конечной даты.

У меня есть это:

Description | Start Date    | End Date    | Duration 
--------------------------------------------------------------------------- 
ABC   | 2015-08-17 10:30:30.000 | 2015-08-17 11:59:59.000 | 0 00:59:59.0 
ABC   | 2015-08-18 11:00:00.000 | 2015-08-18 11:30:00.000 | 0 00:30:00.0 
DEF   | 2015-08-17 08:25:00.000 | 2015-08-17 10:30:00.000 | 0 00:30::00.0 
ABC   | 2015-08-18 11:30:00.000 | 2015-08-18 11:59:59.000 | 0 00:29:59.0 

И я пытаюсь получить что-то вроде этого:

Description | Date  | Hour | Duration 
------------------------------------------- 
ABC   | 2015-08-17 | 11 | 3575 
ABC   | 2015-08-18 | 11 | 3575 
DEF   | 2015-08-17 | 10 | 1800 

Это запрос, я написал:

SELECT Description, 
     DATEPART(HOUR, EndDT), SUM(DATEPART(SECOND, CONVERT(TIME, RIGHT(Duration, LEN(Duration) -2))) + 
     60 * DATEPART(MINUTE, CONVERT(TIME, RIGHT(Duration, LEN(Duration) - 2))) + 
     3600 * DATEPART(HOUR, CONVERT(TIME, RIGHT(Duration, LEN(Duration) - 2)))) 
FROM table 
GROUP BY Description, 
     DATEPART(HOUR, EndDT), 
     DATEADD(d, 0, DATEDIFF(d, 0, EndDT)); 

Этот запрос кажется, не учитывают дни, как я думал, что это произойдет, и я понятия не имею, как это исправить.

я получаю что-то вроде этого:

Description | Hour | Duration 
------------------------------ 
ABC   | 11 | 7150 
DEF   | 10 | 1800 

Я также понимаю, что я не получил дату в отборном заявлении на данный момент, но которые могут быть добавлены позже.

+0

Вы хотите, чтобы часы округлились вверх или вниз? – Matt

ответ

1

Если вы GROUP ваши данные по дате EndDT части только, вы получите то, что вам нужно:

WITH T AS (
    SELECT * 
    FROM (VALUES('ABC', CAST('2015-08-17 10:30:30.000' AS DATETIME), CAST('2015-08-17 11:59:59.000' AS DATETIME), '0 00:59:59.0'), 
       ('ABC', CAST('2015-08-18 11:00:00.000' AS DATETIME), CAST('2015-08-18 11:30:00.000' AS DATETIME), '0 00:30:00.0'), 
       ('DEF', CAST('2015-08-17 08:25:00.000' AS DATETIME), CAST('2015-08-17 10:30:00.000' AS DATETIME), '0 00:30:00.0'), 
       ('ABC', CAST('2015-08-18 11:30:00.000' AS DATETIME), CAST('2015-08-18 11:59:59.000' AS DATETIME), '0 00:29:59.0')) 
      AS V(Description, StartDT, EndDT, Duration) 
) 
SELECT Description , 
     CAST(EndDT AS DATE), 
     DATEPART(HOUR, EndDT) , 
     SUM(DATEPART(SECOND, CONVERT(TIME, RIGHT(Duration, LEN(Duration) - 2))) 
      + 60 * DATEPART(MINUTE,CONVERT(TIME, RIGHT(Duration, LEN(Duration) - 2))) 
      + 3600 * DATEPART(HOUR, CONVERT(TIME, RIGHT(Duration, LEN(Duration) - 2)))) 
FROM T 
GROUP BY 
     Description , 
     CAST(EndDT AS DATE), 
     DATEPART(HOUR, EndDT) 

Для этого я я получаю:

ABC 2015-08-17 11 3599 
ABC 2015-08-18 11 3599 
DEF 2015-08-17 10 1800 

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

1

Это дает вам количество часов и секунд для каждого события в течение каждого дня.

SELECT Description, 
DATEDIFF(s,MIN([Start Date]), MAX([End Date]))/60/60 AS Hour, 
DATEDIFF(s,MIN([Start Date]), MAX([End Date])) AS Duration 
FROM yourtable 
GROUP BY Description, DAY([Start Date]) 

ВЫВОД

Description Hour Duration 
ABC   1  5369 
DEF   2  7500 
ABC   0  3599 

SQL Скрипки: http://sqlfiddle.com/#!3/935c7/15/0

Смежные вопросы