T-Sql Group需要n个小时

时间:2017-10-12 06:58:59

标签: sql-server tsql datetime group-by offset

n小时可以简单组合吗? 我发现了几分钟的相关问题,但我几个小时都无法做到。

我需要将一些数据分组8小时并补偿。

所以前8个小时不是00:00 - 08:00而是22:00(昨天) - 06:00(今天)。

我按小时将其分组并卡住了。 我怎样才能做到这一点? 任何建议都表示赞赏。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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

现在,您需要做的就是按NumberOfOrder分组并加Quantity

SELECT NumberOfOrder, SUM(Quantity) FROM (*)

代替*您放置第一个查询。