我的查询有很多日期时间。
假设我想计算这些日期时间在一个时间段中有多少:
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>
提示:我可能会从报表服务中动态获取时隙。
答案 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
的代码让我知道它是否解决了您的问题。