2011-04-20 84 views
11

我想用sql查詢數據庫以顯示id 1,2,3之間的時間差等。基本上它會比較它下面的所有記錄行。任何幫助,將不勝感激。SQL Datediff - 在行之間找到datediff

IDCODE DATE TIME  DIFFERENCE (MINS) 
1  02/03/2011 08:00  0 
2  02/03/2011 08:10  10 
3  02/03/2011 08:23  13 
4  02/03/2011 08:25  2 
5  02/03/2011 09:25  60 
6  02/03/2011 10:20  55 
7  02/03/2011 10:34  14 

謝謝!

+0

您正在使用哪種RDBMS? – AdaTheDev 2011-04-20 10:06:24

+0

嗨對不起,Microsoft SQL Server管理工作室 – Tyrone2011 2011-04-20 10:14:09

回答

6

標準ANSI SQL解決方案。如果在PostgreSQL的,甲骨文,DB2和Teradata工作:

SELECT idcode, 
     date_time, 
     date_time - lag(date_time) over (order by date_time) as difference 
FROM your_table 
+0

嗨a_horse_with_no_name - 是否有另一個功能,而不是滯後,我可以使用? – Tyrone2011 2011-04-20 10:21:06

+0

這是我知道的唯一一個允許訪問「上一個」行的值的人。 – 2011-04-20 10:26:45

+1

「滯後」不是公認的內置函數名稱。 – Tyrone2011 2011-04-20 10:28:35

21

如果使用SQL Server,一個辦法是做:

DECLARE @Data TABLE (IDCode INTEGER PRIMARY KEY, DateVal DATETIME) 
INSERT @Data VALUES (1, '2011-03-02 08:00') 
INSERT @Data VALUES (2, '2011-03-02 08:10') 
INSERT @Data VALUES (3, '2011-03-02 08:23') 
INSERT @Data VALUES (4, '2011-03-02 08:25') 
INSERT @Data VALUES (5, '2011-03-02 09:25') 
INSERT @Data VALUES (6, '2011-03-02 10:20') 
INSERT @Data VALUES (7, '2011-03-02 10:34') 

SELECT t1.IDCode, t1.DateVal, ISNULL(DATEDIFF(mi, x.DateVal, t1.DateVal), 0) AS Mins 
FROM @Data t1 
    OUTER APPLY (
     SELECT TOP 1 DateVal FROM @Data t2 
     WHERE t2.IDCode < t1.IDCode ORDER BY t2.IDCode DESC) x 

另一種方法是使用一個CTE和ROW_NUMBER(),就像這樣:

;WITH CTE AS (SELECT ROW_NUMBER() OVER (ORDER BY IDCode) AS RowNo, IDCode, DateVal FROM @Data) 

SELECT t1.IDCode, t1.DateVal, ISNULL(DATEDIFF(mi, t2.DateVal, t1.DateVal), 0) AS Mins 
FROM CTE t1 
    LEFT JOIN CTE t2 ON t1.RowNo = t2.RowNo + 1 
ORDER BY t1.IDCode 
+0

我喜歡第一個,它爲我省了很多麻煩,但我對CTE的經驗並不好。對於大型表格,它們在數據庫上佔用過多的資源。 – 2015-08-12 11:59:55