如何解决如何编写此函数以将日期时间差异计算为 hh:mm:ss:ms
我不是开发人员,所以请原谅我的问题。我更喜欢生产 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 开发部分的新手,谢谢
通过第二次编辑,我现在看到了一天的问题:
请看下面
开始时间“5/21/2021 8:00:23 PM”(东部时间)和结束日期“5/22/2021 01:09:0 6 AM”
它返回给我 1 5:9:17.13 这是不正确的,因为不应该是 1 天 5 小时,而是应该是 5 小时,所以当天出了点问题
解决方法
它在datediff()
中计算minute
,因为使用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
您还需要增加返回字符串 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 举报,一经查实,本站将立刻删除。