【问题标题】:How to subtract two datetime values and get the output in HH:MM:SS format in SQL Server?如何在 SQL Server 中减去两个日期时间值并以 HH:MM:SS 格式获取输出?
【发布时间】:2019-07-17 18:23:59
【问题描述】:

我想减去两个日期时间值和 HH:MM:SS 格式的输出。

如果差异超过一天,则需要将天数添加到小时。

我尝试连接 datediff 输出,如下所述

select concat(datediff(hh, '2019-07-16 04:45:03.000','2019-07-17 19:38:13.000')
,':',
(datediff(mi, '2019-07-16 04:45:03.000','2019-07-17 19:38:13.000') -(datediff(hh, '2019-07-16 04:45:03.000','2019-07-17 19:38:13.000')*60))
,':',
(datediff(ss, '2019-07-16 04:45:03.000','2019-07-17 19:38:13.000')-(datediff(mi, '2019-07-16 04:45:03.000','2019-07-17 19:38:13.000')*60)))

预期输出:38:53:10

实际输出:39:-7:10

你能告诉我我犯了什么错误吗?有没有更好的方法来获得所需的输出?

【问题讨论】:

  • time 不支持超过 24 小时的值。您最好在几秒钟内返回差异并让您的显示层担心格式或类似问题。您在显示层使用什么应用程序?这就是您应该在此处标记的内容。
  • 这似乎是这个问题的重复:stackoverflow.com/questions/10538507/…
  • @Larnu 哦,好的,谢谢。 David Browne 提供的答案效果很好。
  • 是的,但是@Venkat 这个解决方案的问题在于它返回了一个varchar,因此,“时间”'11:00:01'after '100:00:00'.
  • 哦,它使用了FORMAT,(老实说)它的表现非常糟糕。

标签: sql-server function datetime formatting azure-sql-managed-instance


【解决方案1】:

类似:

with q as
(
  select datediff(SECOND, '2019-07-16 04:45:03.000','2019-07-17 19:38:13.000') secs
), hms as
(
  select secs/60/60 as hours,  (secs/60) % 60 as minutes , secs % 60 seconds
  from q
)
select concat(format(hours,'00'),':',format(minutes,'00'),':',format(seconds,'00') ) hms
from hms 

返回

38:53:10

【讨论】:

  • Browne 非常感谢,这很好用。我有几个问题,你能澄清一下吗? 1.) 我发布的查询有什么问题? 2.) “ format(hours,'00') ”是做什么的?
  • 小心FORMAT;它表现得很糟糕。你最好避免它。
  • 如果性能很关键,像right(concat('00',hours),2) 这样的东西会更快。
  • 在我看来,这会好得多@DavidBrowne-Microsoft。
  • 为什么我必须在这里使用格式,直接在查询中从 hms 连接小时、分钟和秒会有什么问题。
猜你喜欢
  • 2023-01-21
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多