0

我不是开发人员,所以请原谅我的问题。我更喜欢产品 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 开发部分的新手,谢谢

编辑-在评论中提到的几秒钟内获得 -ve 值

在此处输入图像描述

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

请看下面

开始时间“5/21/2021 8:00:23 PM”(东部时间)和结束日期“5/22/2021 01:09:0 6 AM”

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

您可以看到该值完全不正确 在此处输入图像描述

4

2 回答 2

1

它计算在内datediff(),因为当日期相距很远时minute使用secondor肯定会导致溢出。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

小提琴手

RETURNS VARCHAR(10)您还需要将返回字符串的大小增加到dd:hh:mm:ss.mmm15 个字符


编辑:处理@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
于 2021-05-16T02:28:41.277 回答
0

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

于 2021-05-16T02:11:25.787 回答