如何在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所示。您希望输出什么?您希望输出什么?感谢您的反馈。它似乎按预期工作。感谢您的反馈。它似乎按预期工作。