You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:29:57