SQL Server группы по дате и времени отсечения 10:00 утра - PullRequest
3 голосов
/ 25 января 2012

Я пытаюсь написать запрос Microsoft SQL Server 2005, который подсчитывает общее значение, сгруппированное по дате с точкой отсечения 10:00 утра?

Например: заказы таблицы

DateReceived              Total

01-01-2012 06:10:01       2       
01-01-2012 08:10:01       2   
01-01-2012 10:10:01       4   
02-01-2012 08:00:07       4   
02-01-2012 10:00:07       4  

Я бы хотел посчитать дневной итог, используя 10:00 утра в качестве точки отсечения, поэтому любые заказы до 10:00 утра отображаются в итогах за предыдущий день, а после 10:00 утра - в общем. на этот день.

Я надеюсь увидеть результаты запроса, такие как:

DateReceived              Total

31-12-2011                4       
01-01-2012                8   
02-01-2012                4  

Я знаю, как группировать по дате в Microsoft SQL Server:

SELECT DISTINCT CONVERT(varchar, [DateReceived], 111) AS [dt_DateReceived], 
SUM([Total]) AS perday
FROM         [Orders] 
GROUP BY CONVERT(varchar, [DateReceived], 111)
ORDER BY [DateReceived] DESC

Однако я не уверен, как добавить время отключения в 10:00 с помощью Microsoft SQL Server.

Используя MySQL, я могу добиться этого, группируя по вычитаемому интервалу, однако не знаю, как перевести это на SQL Server:

GROUP BY
  DATE(DATE_SUB( DateReceived , INTERVAL 10 HOUR))

Кто-нибудь может посоветовать?

Спасибо, Jack

1 Ответ

3 голосов
/ 25 января 2012

Посмотреть перевод:

SELECT 
  CONVERT(varchar, DATEADD(hour, -10, [DateReceived]), 111) AS [dt_DateReceived], 
  SUM([Total]) AS perday
FROM [Orders] 
GROUP BY CONVERT(varchar, DATEADD(hour, -10, [DateReceived]), 111)
ORDER BY 1 DESC

Тестовый скрипт

Обратите внимание, что мой локальный формат даты и времени - гггг-мм-дд

;WITH Orders AS (
    SELECT * FROM (VALUES
        (CAST('2012-01-01 06:10:01' AS DATETIME), 2)
        , ('2012-01-01 08:10:01', 2)
        , ('2012-01-01 10:10:01', 4)
        , ('2012-01-02 08:00:07', 4)
        , ('2012-01-02 10:00:07', 4)
    ) AS Orders (DateReceived, Total)       
)
SELECT  CONVERT(varchar, DATEADD(hour, -10, [DateReceived]), 111) AS [dt_DateReceived]
        , SUM([Total]) AS perday
FROM    [Orders] 
GROUP BY 
        CONVERT(varchar, DATEADD(hour, -10, [DateReceived]), 111)
ORDER BY 
        1

Тестовый сценарий может быть выполнен здесь

PS: различие не нужно

...