如何在SQL Server中回填缺少的日期

如何在SQL Server中回填缺少的日期,sql,tsql,Sql,Tsql,我在下面有一张简单的表格。我试图计算到达日期和部门日期之间的时间(以天/小时/分钟/和总小时为单位) CREATE TABLE TEMP ( Flight_ID INT, Arrival_Dt DATETIME, Dept_DT DATETIME ) INSERT INTO temp VALUES ('123', '10/14/2018 09:25 pm', '10/14/2018 11:21 pm'), ('123', '10/14/2018 11:

我在下面有一张简单的表格。我试图计算到达日期和部门日期之间的时间(以天/小时/分钟/和总小时为单位)

CREATE TABLE TEMP 
(
    Flight_ID INT,
    Arrival_Dt DATETIME,
    Dept_DT DATETIME
)

INSERT INTO temp 
VALUES ('123', '10/14/2018 09:25 pm', '10/14/2018 11:21 pm'),
       ('123', '10/14/2018 11:43 pm', NULL),
       ('123', '10/14/2018 11:44 pm', '10/16/2018 08:04 am')
这是我的密码:

SELECT
    ID,
    ARRIVAL_DT,
    DEPT_DT,
    DATEDIFF(SECOND, ARRIVAL_DT, DEPT_DT) / (60 * 60 * 24) AS D,
    DATEDIFF(SECOND, ARRIVAL_DT, DEPT_DT) / (60 * 60) % 24 AS H,
    DATEDIFF(SECOND, ARRIVAL_DT, DEPT_DT) / (60) % 60      AS M,
    CAST(DEPT_DT - ARRIVAL_DT AS FLOAT) * 24               AS TOTAL_HRS
FROM 
    TEMP
我的问题是Dept_Dt列中的空日期。空值的日期应为2018年10月14日晚上11:44,2018年10月14日晚上11:43后一分钟

目前,我正在使用GETDATE函数替换空值。但这样做会使时间呈指数级膨胀

以下是一个例子:

CREATE TABLE TEMP1 
(
    ID INT,
    ARRIVAL_DT DATETIME,
    DEPT_DT DATETIME
)

INSERT INTO TEMP1 
VALUES ('123', '10/14/2018 09:25 PM', '10/14/2018 11:21 PM'),
       ('123', '10/14/2018 11:43 PM', '09/09/2019 09:00 AM'),
       ('123', '10/14/2018 11:44 PM', '10/16/2018 08:04 AM')
正如你所看到的,中间记录的总小时数非常高,329天,9小时,17分钟,总共7905小时

理想情况下,准确时间如下所示:

CREATE TABLE TEMP2 
(
    ID INT,
    ARRIVAL_DT DATETIME,
    DEPT_DT DATETIME
)

INSERT INTO TEMP2 
VALUES ('123', '10/14/2018 09:25 PM', '10/14/2018 11:21 PM'),
       ('123', '10/14/2018 11:43 PM', '10/14/2018 11:44 PM'),
       ('123', '10/14/2018 11:44 PM', '10/16/2018 08:04 AM')

SELECT
    ID,
    ARRIVAL_DT,
    DEPT_DT,
    DATEDIFF(SECOND, ARRIVAL_DT, DEPT_DT) / (60 * 60 * 24) AS D,
    DATEDIFF(SECOND, ARRIVAL_DT, DEPT_DT) / (60 * 60) % 24 AS H,
    DATEDIFF(SECOND, ARRIVAL_DT, DEPT_DT) / (60) % 60      AS M,
    CAST(DEPT_DT - ARRIVAL_DT AS FLOAT) * 24               AS TOTAL_HRS
FROM 
    #TEMP2

问题是-有没有办法找到空值,然后替换它的下一个到达日期?或者,我会非常感谢你的指导。很抱歉,我举了一个冗长的例子,可能会引起一些混乱

您可以使用LEAD功能来实现这一点:

SELECT Flight_ID,
    Arrival_Dt,
    ISNULL(Dept_DT,LEAD(Arrival_Dt) OVER(PARTITION BY Flight_ID ORDER BY Arrival_Dt)) AS Dept_DT
FROM temp

您可以使用LEAD功能来实现这一点:

SELECT Flight_ID,
    Arrival_Dt,
    ISNULL(Dept_DT,LEAD(Arrival_Dt) OVER(PARTITION BY Flight_ID ORDER BY Arrival_Dt)) AS Dept_DT
FROM temp
您是否尝试过:

更新临时设置DEPT\u DT=DATEADDminute,1,ARRIVAL\u DT 其中DEPT_DT为空 如果出发日期当前为空,则将出发日期设置为到达日期后一分钟

如果您试图将其移动到TEMP1中,则:

插入TEMP1 ID、到达日期、部门日期 选择航班号、到达日期、, ISNULLDEPT\u DT,DATEADDminute,1,ARRIVAL\u DT 临时工 您是否尝试过:

更新临时设置DEPT\u DT=DATEADDminute,1,ARRIVAL\u DT 其中DEPT_DT为空 如果出发日期当前为空,则将出发日期设置为到达日期后一分钟

如果您试图将其移动到TEMP1中,则:

插入TEMP1 ID、到达日期、部门日期 选择航班号、到达日期、, ISNULLDEPT\u DT,DATEADDminute,1,ARRIVAL\u DT 临时工
非常感谢。只是想澄清一下,这个例子是1分钟。根据到达日期的不同,可能有几天、几小时。@joe,对不起,我不明白:如果有几天、几小时、几分钟等,那么基础是什么?哦,现在我想我明白了。。您想用下一条记录中的到达日期替换空值。因此,请尝试将DATEADD与下一条到达日期的选择相结合,如@PeterHe所示。谢谢。只是想澄清一下,这个例子是1分钟。根据到达日期的不同,可能有几天、几小时。@joe,对不起,我不明白:如果有几天、几小时、几分钟等,那么基础是什么?哦,现在我想我明白了。。您想用下一条记录中的到达日期替换空值。因此,请尝试将DATEADD与下一条到达日期的选择相结合,如@PeterHe所示。您希望输出什么?您希望输出什么?感谢您的反馈。它似乎按预期工作。感谢您的反馈。它似乎按预期工作。