2017-04-13 70 views
0

原始表具有與間隔T-SQL中SQL Server通過時間範圍組時間間隔變化

間隔列時間戳:在當前和以前的時間戳之間的微小差異,當由時間戳本身

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:002016-12-31 01:15:00,時間間隔保持不變,即15但隨後後2016-12-31 01:15:00

+0

請添加你的數據結構並解釋邏輯以得到你想要的結果 – TriV

+0

@TriV我修改了這個問題 – HighAbove

+0

爲什麼你在'TimeStamp'表中傳遞'2016-12-31 00:45:00'? – TriV

回答

0

改回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 
+0

你非常接近,但是如果你比較我的期望輸出和你的輸出有點不同 – HighAbove

+0

對於輸出中的第二行,理想間隔(我猜)應該是30分鐘,但是它是15分鐘。檢查這 選擇DATEDIFF(分鐘,'2016-12-31 00:30:00','2016-12-31 01:00:00') –

+0

我只是想定義一個範圍的日期每隔一分鐘的時間間隔變化。例如,「2016-12-31 00:30:00」和「2016-12-31 01:00:00」之間的時間間隔保持不變,即15分鐘。突然從'2016-12-31 01:00:00'到時間間隔變爲1 – HighAbove

0

這將工作

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 
+0

不要忘記Endex它大聲笑。你的結果與@Manish Kumar相同。 – HighAbove

+0

'select * into..': - \ – Adam