微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何编写此函数以将日期时间差异计算为 hh:mm:ss:ms

如何解决如何编写此函数以将日期时间差异计算为 hh:mm:ss:ms

我不是开发人员,所以请原谅我的问题。我更喜欢生产 DBA

我们有一个 SSRS 页面,可显示长时间运行的 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 值

enter image description here

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

请看下面

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

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

可以看到值完全不正确

enter image description here

解决方法

它在datediff()中计算minute,因为使用secondmillisecond在日期相距很远时肯定会导致溢出。

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',concat(sg,dy,ms)
from    (
        select  sg = case when @date_start > @date_en then '-' else '' end,dy = abs(datediff(day,@date_en)),hr = abs(diff_mins / 60 % 24),mn = abs(diff_mins % 60),sc = abs(datediff(second,@date_en)
                ) d
        ) d
,

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。