如何在MS SQL Server和MySQL中查询当前月份之前的所有数据
以下是两种数据库的可运行查询方案及注意事项,默认业务表名为your_table,日期筛选字段为create_time,可根据实际场景替换:
MS SQL Server 实现方案
查询语句
SELECT * FROM your_table WHERE create_time < DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0);
注意事项
- 语句中
DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)用于计算当前月第一天的0点,避免使用对字段做函数运算的写法(如YEAR(create_time)/MONTH(create_time)),防止索引失效。 - 原生兼容
datetime、datetime2、smalldatetime等所有SQL Server日期类型,无需额外做类型转换。 - 天然支持跨年场景,无需额外加年份判断逻辑,1月时可正常筛选上一年12月及更早的所有数据。
MySQL 实现方案
查询语句
SELECT * FROM your_table WHERE create_time < DATE_FORMAT(CURDATE(), '%Y-%m-01 00:00:00');
注意事项
- 若
create_time为date类型(无时分秒),可简化条件为create_time < DATE_FORMAT(CURDATE(), '%Y-%m-01')即可正常运行。 - 禁止使用对
create_time做函数转换的筛选逻辑,例如PERIOD_DIFF(DATE_FORMAT(CURDATE(), '%Y%m'), DATE_FORMAT(create_time, '%Y%m')) >0,该写法无法命中日期字段索引,数据量超过10万级时性能会出现明显下降。 - 语句兼容MySQL 5.6及以上所有版本,低版本可替换
CURDATE()为CURRENT_DATE效果完全一致。
通用说明
- 所有语句默认查询全表字段,可将
*替换为实际需要查询的业务字段,进一步提升查询性能。 - 若有额外业务筛选条件,直接在
WHERE子句后追加AND条件即可,不影响日期筛选逻辑的正确性。
内容的提问来源于stack exchange,提问作者Fazza
相关产品推荐
相关产品推荐

