寻求替代INTERVAL '1' YEAR函数获取去年日期的方案
解决获取去年日期的SQL替代方案
首先,你原SQL里的IN是冗余的——CURRENT_DATE - INTERVAL '1' YEAR返回单个日期值,改用=更合理。针对INTERVAL语法失效的问题,给你几个替代方案:
方案1:使用数据库原生日期偏移函数
不同数据库有各自的日期偏移实现,挑适配你环境的用:
- MySQL/MariaDB:
DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR) - PostgreSQL:若原语法失效,可显式转换间隔类型
CURRENT_DATE - '1 year'::interval - SQL Server:
DATEADD(year, -1, GETDATE()) - Hive/Spark SQL:
add_months(current_date(), -12)(比减365天更稳妥,自动处理闰年)
示例(以MySQL为例):
SELECT id, data_load_dt FROM school_inventory WHERE date_parse(data_load_dt, '%Y-%m-%d') = DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR)
方案2:直接对字符串字段做年份计算
由于data_load_dt是%Y-%m-%d格式的字符串,可跳过日期转换,直接拼接出去年的同日期字符串匹配,性能更优:
SELECT id, data_load_dt FROM school_inventory WHERE data_load_dt = CONCAT(YEAR(CURRENT_DATE)-1, '-', LPAD(MONTH(CURRENT_DATE), 2, '0'), '-', LPAD(DAY(CURRENT_DATE), 2, '0'))
注:用LPAD是为了保证月份、日期是两位格式(比如1月转成01),和原字段格式匹配。
方案3:兼容日期转换后的匹配
如果必须保留date_parse转换步骤,换用兼容的日期偏移写法(以Hive为例):
SELECT id, data_load_dt FROM school_inventory WHERE date_parse(data_load_dt, '%Y-%m-%d') = add_months(current_date(), -12)
内容的提问来源于stack exchange,提问作者Crystal
相关产品推荐
相关产品推荐

