简体   繁体   English

当差异只有45分钟时,T-SQL DATEDIFF会给返回结果1小时

[英]T-SQL DATEDIFF giving returning result 1 hours when difference is only 45 minutes

Facing an issue with T-sql Datediff function, I am calculating date difference in minutes between two dates, and then in hours. 面对T-sql Datediff函数的问题,我正在以两个日期之间的分钟为单位,然后以小时为单位,计算日期差。

Minute is giving me correct result 分钟给我正确的结果

SELECT DATEDIFF(minute,'2018-01-22 23:59:00.000','2018-01-23 00:44:00.000')
Result 45 minutes

But when I am trying to calculate hours it's giving me incorrect results for days that are almost over and new day begins, So if the time parameter is '23:59:00' and the second parameter is '00:44:00' it returns 1 hour difference when its only 45 minutes. 但是,当我尝试计算小时数时,它给我几乎结束了几天并开始新的一天的不正确结果,所以如果time参数为'23:59:00'而第二个参数为'00:44:00',当只有45分钟时,返回1小时时差。

SELECT DATEDIFF(HOUR,'2018-01-22 23:59:00.000','2018-01-23 00:44:00.000')
Result 1 Hour --Incorrect

I am expecting this result to be zero 我期望这个结果为零

SELECT DATEDIFF(HOUR,'2018-01-22 23:59:00.000','2018-01-23 00:44:00.000')
Result 0 Hour -- This is the result expected

Update: Posting my Function here if anyone needs to Calculate difference between two dates in format as Day:Hour:Minute 更新:如果有人需要以日期:小时:分钟的格式计算两个日期之间的差,请在此处发布我的函数

ALTER FUNCTION [dbo].[UDF_Fedex_CalculateDeliveryOverdue] 
(
    -- Add the parameters for the function here
    @requiredDate VARCHAR(50), 
    @deliveryStamp VARCHAR(50)
)
RETURNS VARCHAR(25)
AS
BEGIN

DECLARE @ResultVar VARCHAR(25)

 SET @ResultVar = ( SELECT CASE WHEN a.Days = 0 AND a.Hours = 0 THEN CAST(a.Minutes AS VARCHAR(10)) + ' Minutes'
                                WHEN a.Days = 0  THEN CAST(a.Hours AS VARCHAR(10)) + ' Hours ' + CAST(a.Minutes AS VARCHAR(10)) + ' Minutes'
                                ELSE CAST(a.Days AS VARCHAR(10)) +' Day ' + CAST(a.Hours AS VARCHAR(10)) +' Hours ' + CAST(a.Minutes AS VARCHAR(10)) + ' Minutes'

                                    END 

FROM ( SELECT DATEDIFF(hh, @requiredDate,@deliveryStamp)/24 AS 'Days'
        ,(DATEDIFF(MI, @requiredDate,@deliveryStamp)/60) - 
        (DATEDIFF(hh, @requiredDate,@deliveryStamp)/24)*24 AS 'Hours'
        ,DATEDIFF(mi, @requiredDate,@deliveryStamp) - 
        (DATEDIFF(mi, @requiredDate,@deliveryStamp)/60)*60 AS 'Minutes'
        ) a)
    -- Return the result of the function

    RETURN @ResultVar
END

To get value 0 you need to get the result in minutes, and convert to hours: 要获得值0,您需要以分钟为单位的结果,然后转换为小时:

SELECT DATEDIFF(minute,'2018-01-22 23:59:00.000','2018-01-23 00:44:00.000')/60

For more precision: 为了获得更高的精度:

SELECT DATEDIFF(minute,'2018-01-22 23:59:00.000','2018-01-23 00:44:00.000')/60.0

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM