SQL日期范围IF语句编写求助:按日期判断取当月或上月数据
调整后的SQL语句
SELECT * FROM table1 e LEFT JOIN table2 d ON e.ENTITY_NBR = d.entity_nbr AND ( CASE -- 当日为5号之后取当月,否则取上月 WHEN DAY(GETDATE()) > 5 THEN DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1) ELSE DATEADD(MONTH, -1, DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1)) END ) BETWEEN d.MONTH_BEGIN_DATE AND d.MONTH_END_DATE
逻辑说明
- 核心通过
CASE判断当前日期的号数区间,计算出需要查询的目标月份的锚点日期(目标月1日) - 用锚点日期匹配你表中存储的月份起止区间
MONTH_BEGIN_DATE、MONTH_END_DATE,即可自动匹配到符合要求的月份数据
不同数据库适配调整
如果你的数据库不是SQL Server,可以对应修改日期函数:
- MySQL环境:
- 替换
GETDATE()为NOW() - 替换
DATEFROMPARTS(YEAR(NOW()), MONTH(NOW()), 1)为STR_TO_DATE(CONCAT(YEAR(NOW()),'-',MONTH(NOW()),'-01'), '%Y-%m-%d')
- 替换
- Oracle环境:
- 替换
GETDATE()为SYSDATE - 替换当月1日写法为
TRUNC(SYSDATE, 'MM') - 替换上月1日写法为
ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -1)
- 替换
注:上述SQL默认table1别名为e、table2别名为d,如果你的实际表别名规则不同可自行调整。
内容的提问来源于stack exchange,提问作者user16060159
相关产品推荐
相关产品推荐

