格式化 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+)