2014-03-03 161 views
2

我有一個有很多日期時間作爲結果的查詢。SQL查詢:將日期時間分組爲時間段

假設我想算一下這些日期時間多在類似時間段:

07:00 to 08:00 
08:01 to 09:00 

,所以我想是這樣的:

_______________________ 
| slot   | count 
|______________|________ 
| 7:00 - 8:00 | 10 
| 8:01 - 9:00 | 2 

我真的不知道我可以做到有這個結果。 我已經試過這樣的事情,但OBV我得到錯誤:

SELECT something 
FROM something 
WHERE  
     CAST(DATEPART(hour, <data>) as varchar(2)) + ':' + CAST(DATEPART(minute, <data>)as varchar(2)) between <slot1> and <slot2> 

TIPS:可能我會從報告服務動態獲取時隙。

+0

請問DB服務器? SQL Server或Oracle或MySQL .. –

+0

@DipenduPaul對不起:sql server – Alist3r

+0

以何種方式將時間存儲在表中? –

回答

2

這裏查詢來完成你似乎在尋找什麼:

SELECT CAST(DATEPART(HH, time) AS VARCHAR(2))+':00 - '+CAST(DATEPART(HH, time)+1 AS VARCHAR(2))+':00', COUNT(*) 
FROM your_table 
GROUP BY DATEPART(HH, time) 

這裏是SQL Fiddle

[編輯]代碼:

根據新的要求,下面的查詢可以完成你想要什麼:

SELECT (CAST(DATEPART(HH, time) AS VARCHAR(2)) + 
      CASE WHEN DATEPART(MI, time) <= 30 THEN ':00 - '+CAST(DATEPART(HH, time) AS VARCHAR(2))+':30' 
       ELSE ':30 - '+CAST(DATEPART(HH, time)+1 AS VARCHAR(2))+':00' END) AS r, 
     COUNT(*) 
FROM your_table 
GROUP BY 
     (CAST(DATEPART(HH, time) AS VARCHAR(2)) + 
      CASE WHEN DATEPART(MI, time) <= 30 THEN ':00 - '+CAST(DATEPART(HH, time) AS VARCHAR(2))+':30' 
       ELSE ':30 - '+CAST(DATEPART(HH, time)+1 AS VARCHAR(2))+':00' END) 

這裏的代碼是SQL Fiddle

如果你不想使用CASE聲明兩倍在上面的查詢,那麼你可以在封閉電流如下內查詢外部查詢做GROUP BY

SELECT r, COUNT(*) AS cnt FROM 
(
    SELECT (CAST(DATEPART(HH, time) AS VARCHAR(2)) + 
      CASE WHEN DATEPART(MI, time) <= 30 THEN ':00 - '+CAST(DATEPART(HH, time) AS VARCHAR(2))+':30' 
       ELSE ':30 - '+CAST(DATEPART(HH, time)+1 AS VARCHAR(2))+':00' END) AS r 
    FROM your_table 
) tab 
GROUP BY r 

這裏代碼在SQL Fiddle

讓我知道它是否解決了您的問題。

+0

你認爲有可能將插槽分半小時?像 9 - 9:30 | 9:30 - 10 | – Alist3r

+1

它可以通過CASE語句來完成。保持HOUR提取的原樣,我們還需要提取分鐘,並使用'CASE'語句,然後我們需要檢查它是否小於30,然後應連接「:00」,否則應連接「:30」。 –

+0

我不希望你浪費你的時間......但是當你有一些時間花費你可以寫代碼?我會很開心的。否則,沒問題。不管怎麼說,還是要謝謝你!!!!!!! – Alist3r