如何自动设置SQL日期条件以每月提取上月全月数据?
自动提取上月所有记录的SQL条件修改方案
根据不同数据库的SQL方言,以下是实现自动提取上月记录的条件写法:
MySQL/MariaDB
直接计算上月的第一天和最后一天,或用更严谨的时间范围避免遗漏带时分秒的记录:
- 基础写法(适用于仅日期类型):
AND efdtmov BETWEEN DATE_SUB(DATE_FORMAT(NOW(), '%Y-%m-01'), INTERVAL 1 MONTH) AND LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH))
- 严谨写法(兼容datetime/timestamp类型,避免遗漏最后一天晚时段记录):
AND efdtmov >= DATE_SUB(DATE_FORMAT(NOW(), '%Y-%m-01'), INTERVAL 1 MONTH) AND efdtmov < DATE_FORMAT(NOW(), '%Y-%m-01')
说明:DATE_FORMAT(NOW(), '%Y-%m-01')获取当月第一天,减1个月得到上月第一天;LAST_DAY()函数直接返回指定日期所在月的最后一天。
PostgreSQL
利用DATE_TRUNC截断日期到月份级别,配合区间计算:
- 基础写法:
AND efdtmov BETWEEN DATE_TRUNC('month', CURRENT_DATE) - INTERVAL '1 month' AND DATE_TRUNC('month', CURRENT_DATE) - INTERVAL '1 day'
- 严谨写法:
AND efdtmov >= DATE_TRUNC('month', CURRENT_DATE) - INTERVAL '1 month' AND efdtmov < DATE_TRUNC('month', CURRENT_DATE)
说明:DATE_TRUNC('month', CURRENT_DATE)得到当月月初,减1个月是上月月初,减1天则是上月月末。
SQL Server
使用DATEADD和EOMONTH函数组合:
- 基础写法:
AND efdtmov BETWEEN DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0) AND EOMONTH(DATEADD(MONTH, -1, GETDATE()))
- 严谨写法:
AND efdtmov >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0) AND efdtmov < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)
说明:DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) -1, 0)计算上月第一天;EOMONTH()直接返回指定日期所在月的最后一天。
Oracle
通过TRUNC和ADD_MONTHS函数实现:
- 基础写法:
AND efdtmov BETWEEN ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -1) AND LAST_DAY(ADD_MONTHS(SYSDATE, -1))
- 严谨写法:
AND efdtmov >= ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -1) AND efdtmov < TRUNC(SYSDATE, 'MM')
说明:TRUNC(SYSDATE, 'MM')获取当月第一天,减1个月得到上月第一天;LAST_DAY()返回上月最后一天。
内容的提问来源于stack exchange,提问作者William Soares
相关产品推荐
相关产品推荐

