2012-01-25 25 views
3

我想写一个Microsoft SQL Server 2005查询计算一个总值,按截止点上午10:00分组日期?按日期时间截止点上午10:00的SQL服务器组

如:表订单

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点之前的任何订单出现在总的前一天,以及当天上午1​​0: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点使用Microsoft SQL Server截断时间。

使用MySQL,我可以通过减去的间隔分组实现这一点,但是我不能确定如何将此转化为SQL服务器:

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

谁能指教?

谢谢 杰克

回答

3

看到翻译结果:

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 

测试脚本

请注意,我的本地日期时间格式为YYYY-MM-DD

;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 

的testscript可以执行here

PS:不需要区分

+0

+我不太明白的问题,直到我遇到你的解决方案。 –

+1

嗨奥列格,为迟到的答复道歉,我被拉到另一个项目。感谢您的详细答案和测试脚本 - 完美!非常感激。 – Jack