Sql 如何编写此函数以将datetime差异计算为hh:mm:ss:ms

Sql 如何编写此函数以将datetime差异计算为hh:mm:ss:ms,sql,sql-server,datetime,dmv,Sql,Sql Server,Datetime,Dmv,我不是开发者,所以请原谅我的问题。我更喜欢prod DBA 我们有一个SSRS页面,它显示长时间运行的SQL查询并显示运行时间。但是我们需要一种显示持续时间的方法,比如dd:hh:mm:ss:ms 因此,我从下面的代码链接中获得了函数 --get the difference between two datetimes in the format: 'hh:mm:ss' CREATE FUNCTION getDateDiff(@startDate DATETIME, @endDate DATET

我不是开发者,所以请原谅我的问题。我更喜欢prod DBA

我们有一个SSRS页面,它显示长时间运行的SQL查询并显示运行时间。但是我们需要一种显示持续时间的方法,比如dd:hh:mm:ss:ms

因此,我从下面的代码链接中获得了函数

--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开发部分的新手,谢谢

如注释中所述,以秒为单位编辑-get-ve值

通过第二次编辑,我现在看到了day的问题:

请看下面

开始时间为“2021年5月21日下午8:00:23”(东部时间),结束日期为“2021年5月22日上午01:09:0”

它返回给我1 5:9:17.13,这是不正确的,因为不应该是1天,5小时应该是5小时,所以当天出现了一些问题

您可以看到该值完全不正确

函数返回
varchar(10)
dd:hh:mm:ss:ms
模式是14个字符。

它在
min
中计算
datediff()
,因为使用
second
毫秒
肯定会在日期相距较远时导致溢出

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

您还需要增加返回字符串的大小
返回VARCHAR(10)
因为
dd:hh:mm:ss.mmm
是15个字符


编辑:处理
@date\u start
晚于
@date\u 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

我很想知道一个需要一天以上时间的问题@Charlieface:不是真正的工作负载查询,而是sp_server_diagnostics的连接,如果监控服务器正在运行,则会出现与运行相关的跟踪,比如说,自上次重新启动以来,我看到的是30天。是的,我们可以排除这样的过程,但只是以防万一,我们想知道是否有人不想排除them@SQuirrel-很抱歉,我没有标记为答案,因为我遇到了上述代码的问题。秒以(-)负值显示。在我们的案例中,示例日期_start作为输入2021-05-20 07:18:56:000。如果您能指导我如何修正(-ve)秒值,请使用
ABS()
对该值进行必要的修改,然后填写答案,谢谢,非常有帮助。一些数据仍然显示,这是一天中的一天。虽然hh mm ss和ms没有显示
@date\u start
的冲突晚于
@date\u en
案例,但您希望如何处理?提供样本数据和预期结果