日期区间内节假日匹配:从SAS迁移至SQL实现问询
问题
现有两张数据表:
- 一张存储请求日期与SLA信息(表名假设为
request_sla,核心字段request_date、sla_date) - 另一张为美国节假日日期列表(表名假设为
us_holidays,核心字段holiday_date)
需要编写SQL查询,判断每个请求的request_date到sla_date区间内是否存在周一至周五的节假日,存在则生成值为1的标识列has_weekday_holiday,否则为0。该需求此前已通过SAS实现,需迁移至SQL。
解决方案
核心逻辑
通过EXISTS子查询检查区间内是否存在符合条件的工作日节假日,用CASE语句生成标识列。
通用SQL实现
SELECT rs.*, CASE WHEN EXISTS ( SELECT 1 FROM us_holidays uh WHERE uh.holiday_date BETWEEN rs.request_date AND rs.sla_date -- 筛选周一至周五的节假日,需根据数据库调整星期判断逻辑 AND DATEPART(weekday, uh.holiday_date) BETWEEN 1 AND 5 ) THEN 1 ELSE 0 END AS has_weekday_holiday FROM request_sla rs;
不同数据库的星期函数适配
由于各数据库的星期计算函数不同,需针对性调整:
- MySQL:使用
WEEKDAY(),返回0=周一、4=周五,条件改为WEEKDAY(uh.holiday_date) BETWEEN 0 AND 4 - SQL Server:默认
DATEPART(weekday)以周日为1,需先执行SET DATEFIRST 1将周一设为起始,再用BETWEEN 1 AND 5;或直接用DATEPART(weekday, uh.holiday_date) IN (2,3,4,5,6)(对应周一到周五) - PostgreSQL:使用
EXTRACT(DOW FROM uh.holiday_date),返回1=周一、5=周五,条件为EXTRACT(DOW FROM uh.holiday_date) BETWEEN 1 AND 5 - Oracle:使用
TO_CHAR(uh.holiday_date, 'D'),返回1=周日,所以周一到周五对应2-6,条件为TO_CHAR(uh.holiday_date, 'D') BETWEEN '2' AND '6'
与SAS逻辑的对齐
SAS中一般通过遍历区间日期或关联节假日表判断存在性,上述SQL的EXISTS子查询与SAS的逻辑完全等价,都是检查目标区间内是否存在符合条件的工作日节假日。
内容的提问来源于stack exchange,提问作者darkage
相关产品推荐
相关产品推荐

