基于日历表的下一个工作日筛选SQL逻辑实现问询
基于下一个工作日的日历数据筛选实现
看起来你需要把原本依赖「当前系统日期」的日历筛选逻辑,切换成以「下一个工作日」为判断基准对吧?我来帮你梳理清楚实现思路和具体的SQL代码:
1. 先明确核心逻辑替换规则
把原逻辑里的「当前日期」全部替换为「下一个工作日」——也就是从你的日历表中,找到晚于当前系统日期的第一个标记为工作日(Is_Business_Day=1)的日期,再基于这个日期执行筛选:
- 如果下一个工作日是当月的1日/2日(即当月3日之前),返回从起始日期(比如示例里的
2000-01-01)到上上月最后一天的所有日历数据 - 如果下一个工作日是当月3日及以后,返回从起始日期到下一个工作日的前一天的所有日历数据
2. 完整SQL实现示例(以SQL Server为例)
WITH Next_Business_Day_CTE AS ( -- 第一步:计算出下一个工作日 SELECT MIN(Calendar_Date) AS Next_Business_Day FROM Calendar_Date WHERE Calendar_Date > GETDATE() AND Is_Business_Day = 1 ) SELECT cd.* FROM Calendar_Date cd CROSS JOIN Next_Business_Day_CTE nbd WHERE -- 第二步:基于下一个工作日执行筛选逻辑 CASE WHEN DAY(nbd.Next_Business_Day) < 3 THEN -- 当月3日之前:取起始日至上上月月末 cd.Calendar_Date <= EOMONTH(DATEADD(MONTH, -2, nbd.Next_Business_Day)) ELSE -- 当月3日及以后:取下一个工作日之前的所有日期 cd.Calendar_Date < nbd.Next_Business_Day END -- 加上起始日期的限制(可根据实际需求调整) AND cd.Calendar_Date >= '2000-01-01';
关键代码解释
Next_Business_Day_CTE:通过MIN()聚合函数精准定位到当前日期之后的第一个工作日EOMONTH(DATEADD(MONTH, -2, ...)):快速计算下一个工作日所在月份往前推2个月的最后一天(也就是上上月的月末)DAY(nbd.Next_Business_Day) < 3:对应原需求中「当月3日之前」的判断条件
其他数据库适配提示
- MySQL:把
GETDATE()换成CURDATE(),EOMONTH()替换为LAST_DAY(DATE_SUB(nbd.Next_Business_Day, INTERVAL 2 MONTH)) - PostgreSQL:
GETDATE()换成CURRENT_DATE,EOMONTH()替换为DATE_TRUNC('month', nbd.Next_Business_Day) - INTERVAL '2 months' + INTERVAL '1 month' - INTERVAL '1 day'
内容的提问来源于stack exchange,提问作者Swapper
相关产品推荐
相关产品推荐

