我有sql查询,它按指定的日期返回记录 我想要做的是将它们按1小时间隔分组 我的查询返回日期和间隔。 间隔值看起来像这样 8:00,8:30,9:00,9:30,10:00 正如你所看到的那样,间隔产生了5个值,我想要做的就是将它们分组 8:00-9:00,9:00-10:00
我设计了一个查询:
SELECT DATEPART(HOUR,VC.DATE+ VC.INTERVAL) AS DATE
,DATEPART(HOUR,VC.INTERVAL) AS INTERVAL
FROM VMUK_Q1R_IB_CONSOLIDATED VC
但是它的问题就像这样显示8,8,9,9,10 我如何实现这个目标?
答案 0 :(得分:1)
您需要创建一组每小时值并根据值的小时部分重新连接到它。这将确保代表丢失的“桶”。以下CTE将为您提供24小时的查找 - 您也可以使用静态查找表执行相同的操作。
with ranges
as
(
select 0 as value
union all
select r.value+ 1 from ranges r where r.value <= 24
)
select
r.value start
from ranges r
答案 1 :(得分:0)
您可以通过计算或格式化来解决此问题。我认为这个例子的格式化会更简单。试试这个:
SELECT Convert(VarChar(20), DATEPART(HOUR,VC.INTERVAL)) + ':00' AS DATE
,DATEPART(HOUR,VC.INTERVAL) AS INTERVAL
FROM VMUK_Q1R_IB_CONSOLIDATED VC
如果您希望显示完整日期+时间,向下舍入,请尝试以下操作:
SELECT Convert(VarChar(20), VC.Date, 101) + Convert(VarChar(20), DATEPART(HOUR,VC.INTERVAL)) + ':00' AS DATE
,DATEPART(HOUR,VC.INTERVAL) AS INTERVAL
FROM VMUK_Q1R_IB_CONSOLIDATED VC
如果您也想要时间范围,请尝试以下方法:
SELECT Convert(VarChar(20), VC.Date, 101) + Convert(VarChar(20), DATEPART(HOUR,VC.INTERVAL)) + ':00' AS DATE,
,DatePart(HOUR,VC.INTERVAL)) + ':00 - ' + DatePart(HOUR, DateAdd(HOUR, VC.INTERVAL, 1)) + ':00' AS TimeRange
,DATEPART(HOUR,VC.INTERVAL) AS INTERVAL
FROM VMUK_Q1R_IB_CONSOLIDATED VC
答案 2 :(得分:0)
SELECT
DATEPART(HOUR,VC.DATE+ VC.INTERVAL) AS DATE,
case DATEPART(HOUR,VC.INTERVAL)
when 0 then '00:00-00:59'
when 1 then '01:00-01:59'
.
.
etc.
.
.
when 22 then '22:00-22:59'
when 23 then '23:00-23:59'
end AS INTERVAL
FROM VMUK_Q1R_IB_CONSOLIDATED VC