如何用SQL筛选掉每年12月24日至31日的日期
更简洁的SQL筛选方案
你的原始写法虽然可行,但可以通过直接操作日期字段的方式实现更简洁、高效的逻辑,以下是几种推荐的写法:
方法一:直接判断月份和日期范围
避免字符串拼接,直接用数值判断月份和日期区间,逻辑清晰且性能更优:
SELECT DATE_column FROM TABLE_A WHERE NOT (DATEPART(mm, DATE_column) = 12 AND DATEPART(dd, DATE_column) BETWEEN 24 AND 31)
这种写法不需要做字符串转换,数据库能更好地利用DATE_column上的索引(如果存在的话),执行效率比拼接字符串更高。
方法二:基于日期本身的范围比较
这是最推荐的写法,直接通过日期类型的比较筛选,完全符合日期处理的最佳实践:
适用于SQL Server
SELECT DATE_column FROM TABLE_A WHERE DATE_column < DATEFROMPARTS(YEAR(DATE_column), 12, 24)
适用于PostgreSQL
SELECT DATE_column FROM TABLE_A WHERE DATE_column < MAKE_DATE(EXTRACT(YEAR FROM DATE_column)::INT, 12, 24)
适用于MySQL
SELECT DATE_column FROM TABLE_A WHERE DATE_column < STR_TO_DATE(CONCAT(YEAR(DATE_column), '-12-24'), '%Y-%m-%d')
这个逻辑很直观:只保留当年12月24日之前的所有日期,完全不需要枚举具体日期,代码最简洁,而且日期范围查询的索引利用率是最高的。
内容的提问来源于stack exchange,提问作者PeterXO
相关产品推荐
相关产品推荐

