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

无法使用weekday函数时SQL查询前一工作日的逻辑实现咨询

禁用weekday类函数下前一工作日查询实现方案

核心逻辑

你的脚本固定在周一至周五运行,仅需处理周一运行的特殊情况:周一运行时取3天前的上周五数据,周二至周五运行时取1天前的前一日数据即可。

首选实现(完全不调用星期类函数)

找任意一个已知的周一作为基准日期(例如2020-01-06,可自行验证该日期确实为周一),通过日期差值取模的方式判断当日是否为周一,完全规避weekday类函数调用:

SELECT p.businessDate, p.accountNumber -- 按需补充其余查询字段
FROM Table p
WHERE p.businessDate = CASE
    WHEN DATEDIFF(DAY, '2020-01-06', today()) % 7 = 0 THEN DATEADD(DAY, -3, today())
    ELSE DATEADD(DAY, -1, today())
END

该方案适配所有支持DATEDIFF、DATEADD函数的SQL数据库,无需依赖任何星期计算相关的函数,完全符合企业禁用规则。

备选实现(关联工作日历表)

如果企业内部有维护数仓通用的工作日历维度表,优先用该方案,不仅能处理周末跳过,还能自动适配法定节假日等特殊非工作日场景,逻辑最稳定:

SELECT p.businessDate, p.accountNumber -- 按需补充其余查询字段
FROM Table p
INNER JOIN dim_work_calendar cal
ON p.businessDate = cal.previous_work_day
WHERE cal.calendar_date = today()

不同数据库适配调整

如果你的数据库对日期函数有特殊语法,只需要调整对应日期函数的写法即可,核心判断逻辑无需修改:

  • MySQL:将today()替换为curdate(),DATEDIFF参数顺序调整为DATEDIFF(curdate(), '2020-01-06')
  • Oracle:将today()替换为sysdate,DATEADD(DAY, n, date)替换为date + n,DATEDIFF(DAY, date1, date2)替换为date2 - date1
  • SQL Server:将today()替换为cast(getdate() as date)

内容的提问来源于stack exchange,提问作者shadaet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:15:04