2017-10-12 54 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 (*) 

其中代替*你把第一個查詢。