SQL技术求助:如何获取每月1日回溯45天的事件记录?
解决方案
核心思路是先确定当月第一天作为基准时间,再计算该基准日期往前推45天的时间点,最终筛选createddate早于这个时间点的记录。以下是主流数据库的实现代码:
MySQL/MariaDB
SELECT incidentnumber FROM Incident WHERE createddate < DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'), INTERVAL 45 DAY);
DATE_FORMAT(CURDATE(), '%Y-%m-01'):提取当前日期所在月份的第一天(比如6月12日运行时返回'2024-06-01')DATE_SUB(..., INTERVAL 45 DAY):将当月第一天往前推45天,得到筛选的截止时间
PostgreSQL
SELECT incidentnumber FROM Incident WHERE createddate < DATE_TRUNC('month', CURRENT_DATE) - INTERVAL '45 days';
DATE_TRUNC('month', CURRENT_DATE):将当前日期截断到月份维度,直接得到当月第一天- 通过
- INTERVAL '45 days'直接计算45天前的时间点
SQL Server
SELECT incidentnumber FROM Incident WHERE createddate < DATEADD(DAY, -45, DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1));
DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1):拼接当前年份、月份和1号,生成当月第一天DATEADD(DAY, -45, ...):将基准日期往前推45天
Oracle
SELECT incidentnumber FROM Incident WHERE createddate < TRUNC(SYSDATE, 'MM') - INTERVAL '45' DAY;
TRUNC(SYSDATE, 'MM'):截断系统日期到当月第一天- INTERVAL '45' DAY:直接减去45天得到筛选截止时间
逻辑验证
以你提到的6月12日运行报表为例:上述语句会先获取6月1日,再计算出6月1日减45天的日期(平年为4月17日),最终筛选出createddate早于该日期的记录,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Angus Thermopily
相关产品推荐
相关产品推荐

