如何过滤EXPIRATION_DATE字段值为近1年的数据库查询结果
常见数据库实现近1年日期过滤方案
核心逻辑:需要先把字符串格式存储的日期转为标准日期类型,再和当前日期减1年的计算值对比,避免字符串直接比较出现逻辑错误。不同数据库的实现语法如下:
- Oracle
Oracle原生支持DD-MON-RR格式的日期转换,语句示例:
SELECT * FROM 你的表名 WHERE TO_DATE(EXPIRATION_DATE, 'DD-MON-RR', 'NLS_DATE_LANGUAGE = AMERICAN') >= ADD_MONTHS(SYSDATE, -12);
指定NLS_DATE_LANGUAGE参数是为了避免数据库非英文环境下,月份缩写识别异常。
- MySQL
SET lc_time_names = 'en_US'; SELECT * FROM 你的表名 WHERE STR_TO_DATE(EXPIRATION_DATE, '%d-%b-%y') >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR);
提前设置lc_time_names参数保证英文月份缩写可以正常识别。
- PostgreSQL
SELECT * FROM 你的表名 WHERE TO_DATE(EXPIRATION_DATE, 'DD-MON-YY') >= CURRENT_DATE - INTERVAL '1 year';
- SQL Server
SELECT * FROM 你的表名 WHERE CONVERT(DATE, EXPIRATION_DATE, 6) >= DATEADD(YEAR, -1, GETDATE());
注意:如果你的表数据量很大,直接对EXPIRATION_DATE字段做函数转换会导致无法命中该字段的普通索引,查询性能会受影响。这种场景建议优先把字段改为日期类型存储,或者建立对应转换逻辑的函数索引优化性能。
内容的提问来源于stack exchange,提问作者paddyusa
相关产品推荐
相关产品推荐

