格式化 DATEDIFF 输出后的错误持续时间(额外一天)
Wrong Duration after Formatting DATEDIFF Output (Extra Day)
我需要获取两个时间点之间的时长,格式为“DD HH:mm:ss”。
因此,我使用了以下行:
FORMAT(CAST(CONVERT(varchar(20), DATEADD(SECOND, DATEDIFF(SECOND,FirstDate,LastDate), 0), 120) AS datetime), 'dd HH:mm:ss')
但是它有一个错误。 returns 多了一天。因此,当两个日期是同一天时,returns 天数为“01”而不是“00”。
我希望有人能告诉我我哪里错了。
这是我的输出:
FirstDate LastDate Duration
2020-09-24 08:20:42.843 2020-09-24 11:16:28.217 01 02:55:46
2020-09-24 08:20:42.437 2020-09-24 11:16:27.843 01 02:55:45
2020-09-24 08:20:41.373 2020-09-24 11:16:26.640 01 02:55:45
日期是错误的,因为它是一个月中的某一天。您可以分别执行时间和日期组件:
select concat(v.secs / (60*60*24),
' ',
convert(time(0), dateadd(second, v.secs % (60*60*24), 0))
)
from (values (convert(datetime, '2020-09-24 08:20:42.843'),
convert(datetime, '2020-09-24 11:16:28.217'))) t(firstdate, lastdate) cross apply
(values (DATEDIFF(SECOND, t.FirstDate, t.LastDate))) v(secs);
Here 是一个 db<>fiddle.
dateadd + datediff 方法 returns 完整为 1900-01-01 的日期时间 02:55:46.000
因此,通过在格式中使用 dd,您就是从那一天开始的,它确实是 01
有很多方法可以做你想做的事,但这是一种与你的相似的方法:
CONVERT(char(2),FORMAT(DATEDIFF(dd,FirstDate,LastDate),'00')) + ' ' +
CONVERT(varchar(8),CONVERT(time,LastDate - FirstDate))
(假设您使用的是 SQL 服务器 2012+)
我需要获取两个时间点之间的时长,格式为“DD HH:mm:ss”。
因此,我使用了以下行:
FORMAT(CAST(CONVERT(varchar(20), DATEADD(SECOND, DATEDIFF(SECOND,FirstDate,LastDate), 0), 120) AS datetime), 'dd HH:mm:ss')
但是它有一个错误。 returns 多了一天。因此,当两个日期是同一天时,returns 天数为“01”而不是“00”。
我希望有人能告诉我我哪里错了。
这是我的输出:
FirstDate LastDate Duration
2020-09-24 08:20:42.843 2020-09-24 11:16:28.217 01 02:55:46
2020-09-24 08:20:42.437 2020-09-24 11:16:27.843 01 02:55:45
2020-09-24 08:20:41.373 2020-09-24 11:16:26.640 01 02:55:45
日期是错误的,因为它是一个月中的某一天。您可以分别执行时间和日期组件:
select concat(v.secs / (60*60*24),
' ',
convert(time(0), dateadd(second, v.secs % (60*60*24), 0))
)
from (values (convert(datetime, '2020-09-24 08:20:42.843'),
convert(datetime, '2020-09-24 11:16:28.217'))) t(firstdate, lastdate) cross apply
(values (DATEDIFF(SECOND, t.FirstDate, t.LastDate))) v(secs);
Here 是一个 db<>fiddle.
dateadd + datediff 方法 returns 完整为 1900-01-01 的日期时间 02:55:46.000
因此,通过在格式中使用 dd,您就是从那一天开始的,它确实是 01
有很多方法可以做你想做的事,但这是一种与你的相似的方法:
CONVERT(char(2),FORMAT(DATEDIFF(dd,FirstDate,LastDate),'00')) + ' ' +
CONVERT(varchar(8),CONVERT(time,LastDate - FirstDate))
(假设您使用的是 SQL 服务器 2012+)