2015-04-16 131 views
1

我试图用DATETIME字段将记录分组为90分钟间隔。按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小时 ?

回答

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

那么每天有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) 
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小时。