SQL如何做1小时的间隔

时间:2013-11-07 14:06:54

标签: sql tsql sql-server-2008-r2

我有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 我如何实现这个目标?

3 个答案:

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