如何编写此函数来计算日期时间差异为 hh:mm:ss:ms
Posted
技术标签:
【中文标题】如何编写此函数来计算日期时间差异为 hh:mm:ss:ms【英文标题】:How can I write this function to calculate datetime diff as hh:mm:ss:ms 【发布时间】:2021-05-16 01:01:36 【问题描述】:我不是开发人员,所以请原谅我的问题。我更喜欢产品 DBA
我们有一个 s-s-rS 页面,它显示长时间运行的 SQL 查询并显示经过的时间。但是我们需要一种显示持续时间的方法,例如 dd:hh:mm:ss:ms
因此我从链接here 获得了函数,代码如下
--get the difference between two datetimes in the format: 'hh:mm:ss'
CREATE FUNCTION getDateDiff(@startDate DATETIME, @endDate DATETIME)
RETURNS VARCHAR(10)
AS BEGIN
DECLARE @seconds INT = DATEDIFF(s, @startDate, @endDate)
DECLARE @difference VARCHAR(10) =
FORMAT(@seconds / 3600, '00') + ':' +
FORMAT(@seconds % 3600 / 60, '00') + ':' +
FORMAT(@seconds % 60, '00')
RETURN @difference
END
但如果我还需要天和毫秒,就无法让它工作。
如何使用上面的方法显示 dd:hh:mm:ss:ms 或以这种格式返回数据?我们必须确保它适用于 SQL2012 和 +
如果有更好的代码,请指导我,因为我是 SQL 开发部分的新手,谢谢
评论中提到的编辑-在几秒钟内获得-ve值
通过第二次编辑,我现在看到了一天的问题:
请看下面
开始时间“5/21/2021 8:00:23 PM”(东部时间)和结束日期“5/22/2021 01:09:0 6 AM”
它返回给我 1 5:9:17.13 这是不正确的,因为不应该是 1 天和 5 小时,而应该是 5 小时,所以当天出了点问题
您可以看到该值完全不正确
【问题讨论】:
我很想知道一个需要一天以上的查询! @Charlieface :不是真正的工作负载查询,而是来自 sp_server_diagnostics 的连接,如果监控服务器正在运行,则会出现与运行相关的跟踪,假设自上次重新启动以来,我已经看到了 30 天。是的,我们可以排除这样的过程,但以防万一想知道是否不想排除它们 【参考方案1】:它在minute
中计算datediff()
,因为使用second
或millisecond
肯定会在日期相距很远时导致溢出。
declare @date_start datetime = '2021-05-01',
@date_en datetime = getdate()
select [@date_start] = @date_start,
[@date_en] = @date_en,
concat(dy, ':', hr, ':', mn, ':', sc, '.', ms)
from (
select dy = abs(diff_mins / 60 / 24),
hr = diff_mins / 60 % 24,
mn = diff_mins % 60,
sc = datediff(second, dateadd(minute, diff_mins, @date_start), @date_en),
ms = (datepart(millisecond, @date_en) - datepart(millisecond, @date_start) + 1000) % 1000
from (
select diff_mins = datediff(minute, @date_start, @date_en)
) d
) d
dbfiddle
你还需要增加返回字符串RETURNS VARCHAR(10)
的大小,因为dd:hh:mm:ss.mmm
是15个字符
编辑:处理@date_start
晚于@date_en
的位置
还添加了sg
来表示这种情况,标志是-
declare @date_start datetime = '2021-05-31',
@date_en datetime = getdate()
select [@date_start] = @date_start,
[@date_en] = @date_en,
concat(sg, dy, ':', hr, ':', mn, ':', sc, '.', ms)
from (
select sg = case when @date_start > @date_en then '-' else '' end,
dy = abs(datediff(day, @date_start, @date_en)),
hr = abs(diff_mins / 60 % 24),
mn = abs(diff_mins % 60),
sc = abs(datediff(second, dateadd(minute, diff_mins, @date_start), @date_en)),
ms = (datepart(millisecond, @date_en) - datepart(millisecond, @date_start) + 1000) % 1000
from (
select diff_mins = datediff(minute, @date_start, @date_en)
) d
) d
【讨论】:
@SQuirrel- 抱歉,当我遇到上述代码的问题时,我没有标记为答案。秒数以 (-) 负值显示。在我们的例子中,示例 date_start 来自输入 2021-05-20 07:18:56:000。如果您能指导我如何在几秒钟内修复 (-ve) 值,将不胜感激 在值上使用ABS()
编辑了答案并进行了必要的更改
非常感谢您的帮助。一些数据仍然显示 -ve 日。而 hh mm ss 和 ms 并没有显示冲突
对于@date_start
比@date_en
晚的情况,你要怎么办?提供样本数据和预期结果【参考方案2】:
函数返回varchar(10)
。 dd:hh:mm:ss:ms
模式为 14 个字符。
【讨论】:
以上是关于如何编写此函数来计算日期时间差异为 hh:mm:ss:ms的主要内容,如果未能解决你的问题,请参考以下文章