Using datediff in milliseconds can overflow easily, so be cautious of relying on that. (Max. duration is is 24 days, 20 hours, 31 minutes and 23.647 seconds.)
Style 108 produces HH:MM:SS , whereas style 114 supplies HH:MM:SS.nnn , or you can use FORMAT(..., 'hh:mm:ss.fff')
e.g:
CONVERT(NVARCHAR(12),
DATEADD(MILLISECOND, ISNULL(DATEDIFF(MILLISECOND, T.IssueDatetime, T.CalledDateTime), 0), 0)
,114)
However DATEDIFF(MILLISECOND, T.IssueDatetime, T.CalledDateTime)
could be greater than 24 hours, if that is the case no "time only" style is going to display hours larger than 23. So if you need to cater for more than 24 hours you will need to calculate your own hh:mm:ss.nnn string - example below
CREATE TABLE t (
IssueDatetime DATETIME,
CalledDateTime DATETIME
);
INSERT INTO t (IssueDatetime, CalledDateTime)
VALUES ('2023-05-30 10:30:00.002', '2023-06-01 14:53:42.346');
1 rows affected
select
by_style114 = CONVERT(NVARCHAR(12),
DATEADD(MILLISECOND, ISNULL(DATEDIFF(MILLISECOND, T.IssueDatetime, T.CalledDateTime), 0), 0)
,114)
, by_format = FORMAT(DATEADD(MILLISECOND, ISNULL(DATEDIFF(MILLISECOND, T.IssueDatetime, T.CalledDateTime), 0), 0), 'hh:mm:ss.fff')
, by_concat = concat(DATEDIFF(hour, T.IssueDatetime, T.CalledDateTime)
, ':' , DATEDIFF(minute, T.IssueDatetime, T.CalledDateTime) % 60
, ':' , DATEDIFF(second, T.IssueDatetime, T.CalledDateTime) % 60
, '.' , DATEDIFF(MILLISECOND, T.IssueDatetime, T.CalledDateTime) % 188622000 )
from t
by_style114 |
by_format |
by_concat |
04:23:42:343 |
04:23:42.343 |
52:23:42.343 |
fiddle