Datediff超过24小时

时间:2014-03-19 17:39:22

标签: sql

我必须使用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'

问题是:如何解决这个问题?

由于

3 个答案:

答案 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”的最大值。