【问题标题】:SQL Query by time intervalSQL 按时间间隔查询
【发布时间】:2015-11-02 21:22:43
【问题描述】:

所以我使用this 帖子作为参考,但是我想根据 15 分钟的时间段计算所有行。

这是我目前所拥有的:

SELECT      DateAdd(minute, DateDiff(minute, 0, [datetime]), 0) as Timestamp, 
            Count(*) as Tasks
FROM        [table]
GROUP BY    DateAdd(minute, DateDiff(minute, 0, [datetime]), 0)
ORDER BY    Timestamp

这非常适合每分钟获取行数,但是我需要 15 分钟... 所以我改变了:

DateAdd(minute, DateDiff(minute, 0, [datetime]), 0)

DateAdd(minute, DateDiff(minute, 0, [datetime]), 15)

但这只是将日期提前 15 天。

感谢任何帮助!

【问题讨论】:

  • SQL Server 数据类型 Timestamp 与时间无关。这是一个记录版本号。

标签: sql sql-server


【解决方案1】:

要得到 15 分钟,请除以 15(然后再次相乘):

SELECT      DateAdd(minute, 15*(DateDiff(minute, 0, [datetime]) / 15), 0
                   ) as Timestamp, 
            Count(*) as Tasks
FROM        [table]
GROUP BY    (DateDiff(minute, 0, [datetime]) / 15)
ORDER BY    Timestamp;

SQL Server 进行整数除法。如果您想明确自己的意图,请使用FLOOR()

【讨论】:

  • 很好的解释。我会尽快接受答案!谢谢!
【解决方案2】:
SELECT  ROUND(DATEDIFF(SECOND,{d '1970-01-01'},[datetime])/(15 * 60),0) as Timestamp, 
            Count(*) as Tasks
FROM   [table]
GROUP BY    ROUND(DATEDIFF(SECOND,{d '1970-01-01'},[datetime])/(15 * 60),0)
ORDER BY    Timestamp 

【讨论】:

    【解决方案3】:

    如果整数除法给您带来问题,这里有一个替代方法。它将日期时间转换为浮点数,然后使用 floor()。

    SELECT      convert(varchar,cast(round(floor(cast([datetime] as float(53))*24*4)/(24*4),5) as smalldatetime),108)  as Timestamp, 
                Count(*) as Tasks
    FROM        [table]
    GROUP BY    convert(varchar,cast(round(floor(cast([datetime] as float(53))*24*4)/(24*4),5) as smalldatetime),108)
    ORDER BY    Timestamp
    

    我通常将 (24*4) 更改为 96(一天中 15 分钟间隔的数量),但我想我会留下它,以便人们可以看到如何适应其他时间段。

    【讨论】:

      猜你喜欢
      • 2023-02-21
      • 2020-02-14
      • 1970-01-01
      • 2021-06-17
      • 2012-05-25
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多