Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TSQL-将每行的值添加到下一行_Sql_Sql Server_Tsql_Date - Fatal编程技术网

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

TSQL-将每行的值添加到下一行,sql,sql-server,tsql,date,Sql,Sql Server,Tsql,Date,我有两列,我想将每一行的值(小时)添加到下一行 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

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

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

您可以将子查询与
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]
但正如你在第二行看到的那样,由于这是第三行的小时,所以增加了两个小时。此外,最后一行没有新日期,因为没有下一行。您想要的结果是否有误?

试试这个

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

您很可能可以使用运行总计和DATEADD来执行您在此处尝试执行的操作。如何计算运行总计将取决于您使用的sql server版本。2012年和2014年有超前和滞后函数,这使得这非常简单。2008年及更早的时候更具挑战性。搜索running total,你会发现很多例子。