Snowflake SQL:如何获取数字格式的过去12个月起止年月
实现方案
不同SQL数据库的日期处理函数存在差异,以下是主流数据库的具体实现方式,可直接套用:
MySQL/MariaDB
先通过DATE_SUB计算偏移后的日期,再用DATE_FORMAT转成YYYYMM格式,最后转换为数字类型:
-- 起始月份(按示例需求,当前日期减12个月得到202112) SELECT CAST(DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 12 MONTH), '%Y%m') AS UNSIGNED) AS start_month; -- 结束月份(当前日期减1个月得到202211) SELECT CAST(DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), '%Y%m') AS UNSIGNED) AS end_month;
如果确实需要按你最初的逻辑用减13个月作为起始,只需把INTERVAL 12 MONTH改成INTERVAL 13 MONTH即可。
PostgreSQL
使用CURRENT_DATE获取当前日期,通过INTERVAL做月份偏移,TO_CHAR格式化后转成整数:
-- 起始月份 SELECT TO_CHAR(CURRENT_DATE - INTERVAL '12 months', 'YYYYMM')::INTEGER AS start_month; -- 结束月份 SELECT TO_CHAR(CURRENT_DATE - INTERVAL '1 month', 'YYYYMM')::INTEGER AS end_month;
SQL Server
用DATEADD处理日期偏移,可选择FORMAT(可读性高)或CONVERT(性能更优)格式化,再转成数字:
-- 写法1:用FORMAT SELECT CAST(FORMAT(DATEADD(MONTH, -12, GETDATE()), 'yyyyMM') AS INT) AS start_month; SELECT CAST(FORMAT(DATEADD(MONTH, -1, GETDATE()), 'yyyyMM') AS INT) AS end_month; -- 写法2:用CONVERT(推荐大量数据场景) SELECT CAST(CONVERT(VARCHAR(6), DATEADD(MONTH, -12, GETDATE()), 112) AS INT) AS start_month; SELECT CAST(CONVERT(VARCHAR(6), DATEADD(MONTH, -1, GETDATE()), 112) AS INT) AS end_month;
Oracle
通过ADD_MONTHS实现月份偏移,TO_CHAR格式化后转成数字:
-- 起始月份 SELECT TO_NUMBER(TO_CHAR(ADD_MONTHS(SYSDATE, -12), 'YYYYMM')) AS start_month FROM DUAL; -- 结束月份 SELECT TO_NUMBER(TO_CHAR(ADD_MONTHS(SYSDATE, -1), 'YYYYMM')) AS end_month FROM DUAL;
关键说明
按你给出的示例(起始202112、结束202211,当前日期2022-12-29),起始月份对应的偏移量是减12个月而非13个月——减12个月会得到2021-12-29,格式化后正好是202112;如果坚持最初的减13个月逻辑,会得到202111,和你的预期不符,这点需要注意。
内容的提问来源于stack exchange,提问作者dspassion
相关产品推荐
相关产品推荐

