例如:我在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中实现此目的?
答案 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