SQL查询:将日期时间分组为时间段

时间:2014-03-03 16:13:38

标签: sql

我的查询有很多日期时间。

假设我想计算这些日期时间在一个时间段中有多少:

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

所以我想要这样的东西:

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

我真的不知道我能做些什么才能得到这个结果。 我尝试过这样的事情,但是我得到了错误:

SELECT  something
FROM    something   
WHERE       
        CAST(DATEPART(hour, <data>) as varchar(2)) + ':' +  CAST(DATEPART(minute, <data>)as varchar(2)) between <slot1> and <slot2>
提示:我可能会从报表服务中动态获取时隙。

1 个答案:

答案 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

的代码

让我知道它是否解决了您的问题。