You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL Server中补全缺失的Dept_Dt并计算航班时长

解决SQL中用下一条记录的Arrival_Dt替换Dept_Dt NULL值并计算时长的问题

针对你的需求,我们可以用SQL Server的**窗口函数LEAD()**来轻松获取下一条记录的Arrival_Dt,以此替换当前行的Dept_Dt NULL值,之后再进行时长计算。

完整解决方案代码

SELECT 
    Flight_ID AS ID,
    Arrival_Dt,
    -- 用下一条记录的Arrival_Dt替换当前Dept_Dt的NULL值
    ISNULL(Dept_Dt, LEAD(Arrival_Dt) OVER (ORDER BY Arrival_Dt)) AS Dept_Dt,
    -- 计算天数
    DATEDIFF(SECOND, Arrival_Dt, ISNULL(Dept_Dt, LEAD(Arrival_Dt) OVER (ORDER BY Arrival_Dt))) / (60 * 60 * 24) AS D,
    -- 计算小时数(取余24)
    DATEDIFF(SECOND, Arrival_Dt, ISNULL(Dept_Dt, LEAD(Arrival_Dt) OVER (ORDER BY Arrival_Dt))) / (60 * 60) % 24 AS H,
    -- 计算分钟数(取余60)
    DATEDIFF(SECOND, Arrival_Dt, ISNULL(Dept_Dt, LEAD(Arrival_Dt) OVER (ORDER BY Arrival_Dt))) / 60 % 60 AS M,
    -- 计算总小时数
    CAST(ISNULL(Dept_Dt, LEAD(Arrival_Dt) OVER (ORDER BY Arrival_Dt)) - Arrival_Dt AS FLOAT) * 24 AS TOTAL_HRS
FROM TEMP;

关键部分解释

  1. LEAD(Arrival_Dt) OVER (ORDER BY Arrival_Dt):

    • LEAD()函数用于获取当前行之后指定位置的行数据,这里我们取下一行的Arrival_Dt
    • OVER (ORDER BY Arrival_Dt)确保数据按到达时间排序,保证我们获取的是正确的"下一条记录"
  2. ISNULL(Dept_Dt, ...):

    • 检查当前行的Dept_Dt是否为NULL,如果是,则用LEAD()获取的下一行Arrival_Dt替换;如果不为NULL,保留原数值

针对你的测试数据的执行结果

这条SQL会生成和你期望的TEMP2表查询完全一致的结果:

  • 第二条记录的Dept_Dt会被替换为10/14/2018 11:44 PM
  • 计算出的时长为1分钟(D=0, H=0, M=1, TOTAL_HRS≈0.0167),完全符合你的预期

额外说明

如果你的表中存在最后一行Dept_Dt为NULL的情况,LEAD()会返回NULL,这时候你可以根据需求添加默认值(比如用GETDATE()或者其他逻辑),例如:

ISNULL(Dept_Dt, ISNULL(LEAD(Arrival_Dt) OVER (ORDER BY Arrival_Dt), GETDATE()))

内容的提问来源于stack exchange,提问作者joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:31:25