SQL Server:如何避免Datediff返回负小时值,输出Days:HH格式正值
解决Days:HH格式正时长计算问题
首先,你的问题核心是当结束日期(ad.decision_letter)早于开始日期(ad.notification_date)时,时间差计算出现负值,导致小时部分显示负数。我们需要确保计算的是两个日期之间的绝对时长,同时正确拆分天数和小时数。
方案1:基于总秒数的绝对值计算
直接对总秒数取绝对值,再拆分天数和小时,这样无论哪个日期更早,结果都是正数:
SELECT CONVERT(VARCHAR(5), ABS(DATEDIFF(SECOND, ad.notification_date, ad.decision_letter)) / 86400) + ' Day: ' + CONVERT(VARCHAR(5), ABS(DATEDIFF(SECOND, ad.notification_date, ad.decision_letter)) % 86400 / 3600) + ' Hr' AS Days_Open FROM Admit_codes ad -- 可选:过滤空日期,避免计算错误 WHERE ad.notification_date IS NOT NULL AND ad.decision_letter IS NOT NULL
方案2:拆分天数和小时分别取绝对值
如果更倾向于拆分天数和小时计算,记得对小时部分的模运算结果也取绝对值(SQL Server中负数取模仍为负数,比如-11 % 24 = -11):
SELECT CAST(ABS(DATEDIFF(DAY, ad.notification_date, ad.decision_letter)) AS VARCHAR(5)) + ' Day: ' + CAST(ABS(DATEDIFF(HOUR, ad.notification_date, ad.decision_letter) % 24) AS VARCHAR(5)) + ' Hr' AS Days_Open FROM Admit_codes ad WHERE ad.notification_date IS NOT NULL AND ad.decision_letter IS NOT NULL
对你之前尝试的补充说明
- 你第二个查询中的
WHERE 'Days' is not null and 'hours' is not null是错误的,这里的'Days'是字符串常量,永远不会为NULL,应该改为过滤实际的日期列:WHERE ad.notification_date IS NOT NULL AND ad.decision_letter IS NOT NULL。 - 使用
datepart(day, ad.decision_letter - ad.notification_date)的方式不太可靠,因为当日期差不足1天时,datepart(day)会返回0,而且如果日期差为负,结果也会异常,不如直接用DATEDIFF结合ABS更稳妥。
内容的提问来源于stack exchange,提问作者user9829481
相关产品推荐
相关产品推荐

