2017-10-12 69 views
1

它可能简单的小组由n小时? 我发现了几分钟的相关问题,但不能用几个小时来完成。T-Sql小组由n小时

我需要将一些数据按偏移量分组8小时。

因此,前8小时不是00:00 - 08:00,而是22:00(昨天) - 06:00(今天)。

我按小时分组,并卡住了。 我该怎么做? 任何意见表示赞赏。

回答

2

您可以使用DATEADD/DATEDIFF技巧以8小时为间隔进行分组。

您需要添加一个偏移,虽然在这种情况下

  • 添加2小时至22:30转移至00:30。或07:30回到09:30
  • 按8小时间隔组(0-8,8-16,8-24)
  • 减去2将舍入的00:00改回到22:00或圆形的08:00至06:00

示例脚本

DECLARE @foo table (foo smalldatetime, bar int); 

INSERT @foo (foo, bar) 
VALUES 
    ('2017-10-11 21:00', 1), 
    ('2017-10-11 22:00', 2), 
    ('2017-10-11 23:00', 3), 
    ('2017-10-12 01:00', 4), 
    ('2017-10-12 03:00', 5), 
    ('2017-10-12 05:00', 6), 
    ('2017-10-12 07:00', 7), 
    ('2017-10-12 08:00', 8); 

SELECT 
    SUM(bar), 
    DATEADD(hh, ((DATEDIFF(hh, 0, foo)+2)/8*8)-2, 0) 
FROM 
    @foo 
GROUP BY 
    DATEADD(hh, ((DATEDIFF(hh, 0, foo)+2)/8*8)-2, 0); 
+0

非常感谢您的帮助 – Bogu

0

我不知道没有数据,输入输出也没有(你应该提供),但这里的一些基本方法:

假设我们有简单的表(名为SimpleTable)2列:畅销的产品和数量的销售时间:

SellingTime    | Quantity 
2013-01-02 08:43:22.011 | 4 
2013-02-12 12:32:12.001 | 14 
etc. 

现在,我们将增加订购数量为每个日期:1时间22-6等之间

SELECT SellingTime, Qunatity, 
     CASE WHEN DATEPART(hh, SellingTime) >= 22 AND DATEPART(hh, SellingTime) < 6 THEN 1 
      WHEN DATEPART(hh, SellingTime) >= 6 AND DATEPART(hh, SellingTime) < 14 THEN 2 
      ELSE 3 END AS NumberOfOrder 
FROM SimpleTable 

现在,所有你需要做的就是按​​和求和Quantity

SELECT NumberOfOrder, SUM(Quantity) FROM (*) 

其中代替*你把第一个查询。