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

日期区间内节假日匹配:从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:22:35