【问题标题】:Grouping a time field into 5 minute periods in SQL server在 SQL Server 中将时间字段分组为 5 分钟的时间段
【发布时间】:2014-07-17 12:39:43
【问题描述】:

我有一列时间,想创建第二列来显示他们在 24 小时制时钟上属于哪个 5 分钟间隔。例如

15:19:52 becomes 15:15:00
15:20:11 becomes 15:20:00

【问题讨论】:

    标签: sql sql-server-2012


    【解决方案1】:

    您可以执行以下操作。它建立了时间

    SELECT TIMEFROMPARTS(
             DATEPART(HOUR, yourTimeField),
             DATEPART(MINUTE, yourTimeField) / 5 * 5, 0,
             0,
             0)
    FROM yourTable
    

    Link to SQL Fiddle Example

    【讨论】:

    • 不错。不知道那件事。 (哦,好吧。我用的是 2008 哈哈)
    • @RoyiNamir:2008 年没有TIMEFROMPARTS(我也有),但你可以像SELECT CAST(DATEPART(HOUR, yourTimeField) as CHAR(2))+':'+ CAST((DATEPART(MINUTE, yourTimeField) / 5 * 5) as CHAR(2))+':00' as TimeIntervalFive FROM times 那样即兴发挥
    • @Edper 我的解决方案也很灵活,您可以在其中进行更多微调以决定落在哪一步。 (离线评论)/但它的解决方案要重得多:-)
    • 顺便说一句,您的解决方案是一个非常好的解决方案,尽管正如您所说的“更重”的解决方案。
    【解决方案2】:

    我发现一个线程可以帮助您开始使用它。

    T-SQL: Round to nearest 15 minute interval

    但是,这里的所有示例似乎都只是四舍五入,因此您需要从结果中减去 5 才能得到您想要的结果。

    【讨论】:

    • 分钟间隔可以任意调整,不要被标题误导。
    • 这个作为评论比较合适。
    • 当我获得 50 个代表时,我会很高兴这样做 :)
    • @PWilliams0530 这里需要 10 :-)
    【解决方案3】:

    另一个简化的解决方案是创建时间线并找到您的确切位置:

    DECLARE @t TABLE (b  TIME)
    
    
    INSERT INTO @t
    VALUES   (  '14:16') ,( '15:19:52') ,('15:20:11')
    
    
    ;
    WITH cte AS (
             SELECT CAST ('00:00'AS TIME) AS a
             UNION ALL
             SELECT DATEADD(MINUTE, 5, a) from cte
             WHERE  cte.a   <  CAST ('23:54:00' AS TIME)
         )
    SELECT * FROM @t CROSS APPLY(SELECT TOP 1 a FROM cte WHERE  a<=b ORDER BY
           a         DESC) k  option (maxrecursion 0)
    
    
    
    
    b   a
    14:16:00.0000000    14:15:00.0000000
    15:19:52.0000000    15:15:00.0000000
    15:20:11.0000000    15:20:00.0000000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      • 2018-05-15
      • 2017-10-29
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      相关资源
      最近更新 更多