TSQL-将每一行的值添加到下一行

时间:2014-10-17 12:14:02

标签: sql sql-server tsql date

我有2列,我想将每行的值(小时)添加到下一行。

Date               Hour
2014-01-13 13:00   0
2014-01-13 14:00   3
2014-01-13 16:00   2

我希望有一个新的日期列,显示如下:

Date               Hour      **New_Date**
2014-01-13 13:00   0         2014-01-13 16:00      
2014-01-13 14:00   3         2014-01-13 17:00 
2014-01-13 16:00   2         2014-01-13 18:00

2 个答案:

答案 0 :(得分:0)

您可以将子查询与DATEADD

一起使用
SELECT [Date], [Hour],
       DATEADD(hour, (SELECT TOP 1 t2.[Hour]
                      FROM dbo.Tablename t2
                      WHERE t2.[Date] > t1.[Date]
                      ORDER BY t2.[Date]), [Date])
       AS [New_Date]
FROM dbo.TableName t1
ORDER BY [Date]

但是正如你在this sql-fiddle中所看到的那样,这个行是第三行的小时,因此增加了两个小时。此外,最后一行没有新日期,因为没有下一行。你想要的结果是错的吗?

答案 1 :(得分:0)

试试这个..

CREATE TABLE #temp
  (
     [Date] DATETIME,
     [Hour] INT
  )

INSERT INTO #temp
            ([Date],[Hour])
VALUES      ('2014-01-13 13:00:00',0),
            ('2014-01-13 14:00:00',3),
            ('2014-01-13 16:00:00',2)

;WITH cte
     AS (SELECT Row_number()
                  OVER(
                    ORDER BY [date]) AS id,
                *
         FROM   #temp)
SELECT a.Date,
       a.Hour,
       Dateadd(hh, a.Hour, CASE
                             WHEN a.id != 1 THEN a.[date]
                             ELSE (SELECT TOP 1 date
                                   FROM   cte
                                   ORDER  BY id DESC)
                           END) newdate
FROM   cte a
       LEFT JOIN cte b
              ON a.id = b.id + 1 

输出

         Date             Hour             newdate
2014-01-13 13:00:00.000    0        2014-01-13 16:00:00.000
2014-01-13 14:00:00.000    3        2014-01-13 17:00:00.000
2014-01-13 16:00:00.000    2        2014-01-13 18:00:00.000