按90分钟间隔分组

时间:2015-04-16 13:40:37

标签: tsql

我尝试将记录与DATETIME字段分组为90分钟。

我可以按任意分钟分组,其中60可以被使用:

整除
SET @Interval = 3 -- Every 3 Minutes
SELECT   CAST(
     CONVERT(VARCHAR(8), [TIME_STAMP],112)            + ' ' +
     CONVERT(VARCHAR(2), DATEPART(hh, [TIME_STAMP]))  + ':' +
     CONVERT(VARCHAR(2), DATEPART(mi, [TIME_STAMP]) / @Interval * @Interval)
             AS DATETIME) INTERVAL_TIME

或使用以下整数小时分组:

SET @Interval = 4 --Every 4 hours 
SELECT CAST(
    CONVERT(VARCHAR(8), [TIME_STAMP],112) + ' ' +
    CONVERT(VARCHAR(2), DATEPART(hh, [TIME_STAMP]) / @Interval * @Interval ) 
            + ':00'
            AS DATETIME) INTERVAL_TIME

如何分组90分钟或1.5小时?

3 个答案:

答案 0 :(得分:2)

您可以使用DATEDIFF(minute, 0, [TimeStamp])来获取从纪元开始的分钟数。然后你可以简单地除以90并获得你所在的组。

也许你必须添加一些偏移量。使用DATEADD(minute, [your group]*90, 0),您可以获得该特殊组的开始时间。

对于你的代码(+减少许多演员阵容):

DECLARE @Interval int = 90
DECLARE @OffsetTime datetime = 0

SELECT DATEADD(minute, (DATEDIFF(minute, @OffsetTime, [TimeStamp]) / @Interval) * @Interval, @OffsetTime) INTERVAL_TIME

请注意,此代码适用于您要分组的任何时间间隔。

答案 1 :(得分:1)

一天有16个单独的90分钟间隔,每天由1440分钟组成。

计算当天的当前分钟并计算其间隔。假设它的15:20

ROUND(1440 / ((DATEPART(hh, [TIME_STAMP]) * 60) + DATEPART(mm, [TIME_STAMP])), 0, 1)

这变成了:

ROUND(1440 / ((15*60) + 20), 0, 1)

所以你回答的是10.当天的第10个间隔。将此计算添加到您的列和组中。

SELECT Col1, Col2, ROUND(1440 / ((DATEPART(hh, [TIME_STAMP]) * 60) + DATEPART(mm, [TIME_STAMP])), 0, 1)
    FROM MyTable
    GROUP BY    ROUND(1440 / ((DATEPART(hh, [TIME_STAMP]) * 60) + DATEPART(mm, [TIME_STAMP])), 0, 1)

答案 2 :(得分:0)

假设您有一个transaction_date列的日期时间表,您可以这样做 -

select count(1) from tbl_master group by datediff(minute,cast(floor(cast(transaction_date as float)) as datetime),transaction_date)/90

这里我们将transaction_date转换为浮动然后将其铺设。因此,时间部分将从日期时间中删除。然后我们使用datediff计算总分钟数并将其除以90,持续1.5小时。