T-SQL将时间间隔更改按SQL server中的日期范围分组

T-SQL将时间间隔更改按SQL server中的日期范围分组,sql,sql-server,max,aggregate-functions,min,Sql,Sql Server,Max,Aggregate Functions,Min,原始表具有带间隔的列时间戳 间隔:按时间戳本身排序时,当前时间戳与上一个时间戳之间的分钟差 Timestamp Interval(InMinute) 2016-12-31 00:28:00 NULL 2016-12-31 00:29:00 1 2016-12-31 00:30:00 1 2016-12-31 00:45:00 15 2016-12-31 01:00:00 15 2016-12-31 01:15:00 15

原始表具有带间隔的列时间戳

间隔:按时间戳本身排序时,当前时间戳与上一个时间戳之间的分钟差

Timestamp               Interval(InMinute)
2016-12-31 00:28:00     NULL
2016-12-31 00:29:00     1
2016-12-31 00:30:00     1
2016-12-31 00:45:00     15
2016-12-31 01:00:00     15
2016-12-31 01:15:00     15
2016-12-31 01:16:00     1
2016-12-31 01:17:00     1
2016-12-31 01:18:00     1
2016-12-31 01:19:00     1
我想使用T-SQL检测时间间隔的变化并生成输出

StartDate                EndDate                Interval
2016-12-31 00:28:00      2016-12-31 00:30:00    1
2016-12-31 00:30:00      2016-12-31 01:15:00    15
2016-12-31 01:15:00      2016-12-31 01:19:00    1
我想告诉你一个间隔保持了多久。第二行表示从
2016-12-31 00:30:00
2016-12-31 01:15:00
,间隔保持不变,即15。但是在
2016-12-31 01:15:00之后,它又变回了1

declare @tbl table
(datec datetime)

insert into @tbl
select '2016-12-31 00:29:00'
union all
select '2016-12-31 00:30:00'
union all
select '2016-12-31 00:45:00'
union all
select '2016-12-31 01:00:00'
union all
select '2016-12-31 01:01:00'
union all
select '2016-12-31 01:02:00'

select datec,nextdatec,datediff(MINUTE,datec,nextdatec) as diff from (
select datec,LEAD(datec) over(order by datec) as nextdatec from @tbl
) tbl
where datediff(MINUTE,datec,nextdatec) is not null
这会奏效的

    CREATE TABLE ##T1 (DATE_STAMP DATETIME)

INSERT INTO ##T1 VALUES  ('12-31-2016 00:29:00')
INSERT INTO ##T1 VALUES  ('12-31-2016 00:30:00')
INSERT INTO ##T1 VALUES  ('12-31-2016 00:45:00')
INSERT INTO ##T1 VALUES  ('12-31-2016 01:00:00')
INSERT INTO ##T1 VALUES  ('12-31-2016 01:01:00')
INSERT INTO ##T1 VALUES  ('12-31-2016 01:02:00')

 SELECT ROW_NUMBER() OVER(ORDER BY DATE_STAMP) ID, * INTO ##T2 FROM ##T1

 SELECT  A.DATE_STAMP START_DATE
         ,B.DATE_STAMP END_DATE
         ,DATEDIFF(MINUTE, A.DATE_STAMP, B.DATE_STAMP) INTERVAL
 FROM ##T2 A 
      INNER JOIN ##T2 B 
         ON B.ID = A.ID + 1

DROP TABLE ##T1, ##T2
回答


请添加您的数据结构并解释逻辑以获得所需的result@TriV我对问题进行了一点修改,为什么您在
TimeStamp
表中通过
2016-12-31 00:45:00
?@TriV,因为
2016-12-31 00:45:00
已经包含在
2016-12-31 00:30:00
2016-12-31 01:00:00
范围内。如果您注意到,
2016-12-31 01:01:00
也在最后一行range@HighAbove在显示间隔时,您希望使用什么规则?您非常接近,但是如果您比较我的期望输出和您的期望输出,它们在输出的第二行有点不同,理想间隔(我猜)应该是30分钟,但它是15分钟。选中此选项选择DATEDIFF(分钟,'2016-12-31 00:30:00','2016-12-31 01:00:00')我只想定义一个日期范围,只要时间间隔以分钟为单位发生变化。例如,
2016-12-31 00:30:00
2016-12-31 01:00:00
之间的时间间隔保持不变,为15分钟。突然,时间间隔从
2016-12-31 01:00:00
变为1,直到我理解的是,例如,如果时间介于2016-12-31 00:10:00和2016-12-31 00:25:00之间,则时间间隔应为15,但如果时间介于2016-12-31 00:30:00和2016-12-31 01:05:00之间,则不应显示该时间间隔。别忘了将其Endex lol。结果与@Manish Kumar相同。
选择*进入..
:-\