无法使用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
相关产品推荐
相关产品推荐

