我必须使用datetimeoffset字段,我想计算它之间的时间。
我做到了:
CONVERT(varchar(5), DATEADD(MINUTE,DATEDIFF(MINUTE, P.DT_INIC_PARD , P.DT_TMNO_PARD ),0),114) AS 'Duration'.
问题是:当时间间隔超过24小时时,结果查询会显示'00:00'。
示例:
P.DT_INIC_PARD = 2014-03-18 07:00:00.0000000 -03:00
P.DT_TMNO_PARD = 2014-03-19 07:20:00.0000000 -03:00
这给了我超过24小时。并告诉我'00:20'
问题是:如何解决这个问题?
由于
答案 0 :(得分:2)
你打算用DATEADD()
函数做什么?它正在做的是将您的DATEDIFF()
输出转换为DATETIME
字段,然后您CONVERT()
为时间格式。您无法以时间格式00:00
显示超过24小时,因此您需要选择其他方式来显示输出。
这很好用:
SELECT DATEDIFF(MINUTE, '2014-03-18 07:00:00.0000000' , '2014-03-19 07:20:00.0000000' ) -- 1460 minutes
如果您希望结果以天/小时/分钟为单位,则可以使用模数除法:
WITH cte AS (SELECT DATEDIFF(MINUTE, '2014-03-18 07:00:00.0000000' , '2014-03-19 07:20:00.0000000') Duration)
SELECT CAST(Duration/1440 AS VARCHAR(15))+'d '
+ CAST((Duration-1440)/60 AS VARCHAR(15))+'h '
+ CAST((Duration-1440)%60 AS VARCHAR(15))+'m'
FROM cte
答案 1 :(得分:0)
您可以执行以下操作:
SELECT CAST(Duration/60 AS VARCHAR(5)) + ':' +
RIGHT('0'+ CAST(Duration % 60 AS VARCHAR(2)),2)
FROM ( SELECT DATEDIFF(MINUTE, P.DT_INIC_PARD, P.DT_TMNO_PARD) Duration
FROM YourTable) A
答案 2 :(得分:0)
我采用了略有不同的方法,尤其适用于时差较大的情况。输出格式如下:
HH:MM:SS
当然可以通过删除/添加不同的部分来尝试。这是通常针对一个值完成的方式:
DECLARE @NumberOfSeconds INT = 123
SELECT (CASE WHEN FLOOR(@NumberOfSeconds / (60 * 60)) < 10 THEN '0' ELSE '' END) +
CAST(FLOOR(@NumberOfSeconds / (60 * 60)) AS VARCHAR(MAX)) + ':' +
(CASE WHEN FLOOR((@NumberOfSeconds % (60 * 60)) / 60) < 10 THEN '0' ELSE '' END) +
CAST(FLOOR((@NumberOfSeconds % (60 * 60)) / 60) AS VARCHAR(MAX)) + ':' +
(CASE WHEN FLOOR((@NumberOfSeconds % (60 * 60)) % 60) < 10 THEN '0' ELSE '' END) +
CAST(FLOOR((@NumberOfSeconds % (60 * 60)) % 60) AS VARCHAR(MAX))
对于这个具体问题:
SELECT (CASE WHEN FLOOR(DATEDIFF(SECOND, DT_INIC_PARD, DT_TMNO_PARD) / (60 * 60)) < 10 THEN '0' ELSE '' END) +
CAST(FLOOR(DATEDIFF(SECOND, DT_INIC_PARD, DT_TMNO_PARD) / (60 * 60)) AS VARCHAR(MAX)) + ':' +
(CASE WHEN FLOOR((DATEDIFF(SECOND, DT_INIC_PARD, DT_TMNO_PARD) % (60 * 60)) / 60) < 10 THEN '0' ELSE '' END) +
CAST(FLOOR((DATEDIFF(SECOND, DT_INIC_PARD, DT_TMNO_PARD) % (60 * 60)) / 60) AS VARCHAR(MAX)) + ':' +
(CASE WHEN FLOOR((DATEDIFF(SECOND, DT_INIC_PARD, DT_TMNO_PARD) % (60 * 60)) % 60) < 10 THEN '0' ELSE '' END) +
CAST(FLOOR((DATEDIFF(SECOND, DT_INIC_PARD, DT_TMNO_PARD) % (60 * 60)) % 60) AS VARCHAR(MAX))
FROM YourTable
据我所知,这种方法在最大的时差内可以达到“ int”的最大值。