获取连续行的时差

时间:2014-12-31 12:49:06

标签: sql-server

例如:我在select语句中有两列,其中一列是id&另一个是Datetime列。

我想要的是第三列,它表示一个接一行的时差。

IdColumn      DateTimeColumn         DifferenceColumn 
-----------------------------------------------------
   1          2014-12-31 14:14:55.050        0
   2          2014-12-31 16:14:55.050        2
   3          2014-12-31 19:14:55.050        3
   4          2014-12-31 21:14:55.050        2

此处DifferenceColumn是每行相互之间的小时差异。

如何在SQL Server中实现此目的?

3 个答案:

答案 0 :(得分:2)

使用 SELF join

   SELECT T1.IdColumn, T1.DateTimeColumn, 
          ISNULL(DATEDIFF(hour, t2.DateTimeColumn , t1.DateTimeColumn), 0) as Diff 
   FROM #Test AS T1 LEFT JOIN #Test AS T2 
   ON t1.IdColumn = t2.IdColumn + 1

答案 1 :(得分:1)

如果您使用Lead Function

,请使用Sql server 2012+
SELECT IdColumn,
       DateTimeColumn,
       isnull(Datediff(hh, Lead(DateTimeColumn)OVER(ORDER BY IdColumn) DifferenceColumn, DateTimeColumn),0) 
From Tablename

对于早期版本,请使用以下查询。

方法1: Self Join

SELECT a.IdColumn,
       a.DateTimeColumn,
       Isnull(Datediff(hh, b.DateTimeColumn, a.DateTimeColumn), 0) DifferenceColumn
FROM   tablename a
       LEFT JOIN tablename b
              ON a.IdColumn = b.IdColumn + 1 

方法2: Correlated Subquery

SELECT IdColumn,
       DateTimeColumn,
       Isnull((SELECT TOP 1 Datediff(hh, b.DateTimeColumn, a.DateTimeColumn)
               FROM   Tablename b
               WHERE  a.idcolumn > b.IdColumn
               ORDER  BY IdColumn DESC), 0) AS DifferenceColumn
FROM   Tablename a 

答案 2 :(得分:0)

CTE可以帮到你。请参考下面的SQL:

insert into test values (1,'1-12-2002');
insert into test values (2,'2-12-2003');
insert into test values (3,'3-12-2004');


with cte as
(SELECT
   ROW_NUMBER() OVER (ORDER BY id) row,
  Id    , doj
 FROM test)


SELECT 
   a.Id     ,
   DATEDIFF ( month , b.doj , a.doj) as 'diffmonth'
FROM
   cte a
   LEFT  JOIN cte b
   on  a.row = b.row+1