SQL Server中关联两表计算工作日日期差值的技术咨询
计算SQL Server中两张表的日期工作日差值
嘿,我来帮你搞定这个需求!要计算Transactions表的Date_Reported和Tran_Ex表的Date_Received之间的工作日差值(周一到周五,不含周末),我们可以通过关联两张表+日期计算的方式实现,下面是具体的方案:
基础版(仅排除周末)
首先我们需要通过customer_id关联两张表,然后用日期函数计算工作日差。这里的核心是先算总天数,再减去周末的天数,同时调整首尾日期刚好是周末的特殊情况:
SELECT t.Date_Reported AS [Date Reported], te.Date_Received AS [Date Received], -- 计算工作日差值逻辑 DATEDIFF(day, te.Date_Received, t.Date_Reported) - (DATEDIFF(week, te.Date_Received, t.Date_Reported) * 2) - CASE WHEN DATENAME(weekday, te.Date_Received) = 'Sunday' THEN 1 ELSE 0 END - CASE WHEN DATENAME(weekday, t.Date_Reported) = 'Saturday' THEN 1 ELSE 0 END AS [Difference in days] FROM Transactions t INNER JOIN Tran_Ex te ON t.customer_id = te.customer_id -- 可根据需求添加WHERE条件过滤,比如WHERE t.Date_Reported IS NOT NULL AND te.Date_Received IS NOT NULL
代码逻辑解释:
DATEDIFF(day, ...):得到两个日期之间的总天数(DATEDIFF(week, ...)*2):计算两个日期跨度内包含的周末总天数(每周2天)- 最后两个
CASE语句:如果起始日是周日,多减1天;如果结束日是周六,多减1天,避免把周末天数算进去
进阶版(排除周末+自定义节假日)
如果你的业务需要排除法定节假日,那我们需要先准备一个存储节假日的表(比如Holidays,包含HolidayDate字段),然后在计算时减去期间的节假日数量:
SELECT t.Date_Reported AS [Date Reported], te.Date_Received AS [Date Received], -- 基础工作日计算 (DATEDIFF(day, te.Date_Received, t.Date_Reported) - (DATEDIFF(week, te.Date_Received, t.Date_Reported) * 2) - CASE WHEN DATENAME(weekday, te.Date_Received) = 'Sunday' THEN 1 ELSE 0 END - CASE WHEN DATENAME(weekday, t.Date_Reported) = 'Saturday' THEN 1 ELSE 0 END) -- 减去期间的节假日(排除周末的节假日,因为已经减过周末了) - (SELECT COUNT(*) FROM Holidays h WHERE h.HolidayDate BETWEEN te.Date_Received AND t.Date_Reported AND DATENAME(weekday, h.HolidayDate) NOT IN ('Saturday', 'Sunday')) AS [Difference in days] FROM Transactions t INNER JOIN Tran_Ex te ON t.customer_id = te.customer_id
额外提示
- 如果
Date_Reported可能早于Date_Received,差值会是负数,你可以用ABS()函数把结果转为非负:把整个计算表达式包在ABS(...)里即可 - 确保两个日期字段都不为空,否则计算会得到
NULL,可以用ISNULL()或者WHERE条件过滤空值
内容的提问来源于stack exchange,提问作者Taz
相关产品推荐
相关产品推荐

