Snowflake SQL按日期区间取对应月份时报类型转换错误咨询
报错原因
CASE WHEN语句的两个返回分支数据类型不匹配是报错的核心原因:
- 第一个分支
LAST_DAY(ADD_MONTHS(CURRENT_DATE(), - 2), 'MM')返回值为DATE类型 - 第二个分支
MONTH(CURRENT_DATE)返回值为NUMBER数字类型
Snowflake要求CASE WHEN的所有返回分支必须输出统一类型,因此触发了类型转换失败的报错。
修正后SQL代码
SELECT CURRENT_DATE, CASE WHEN DAY(CURRENT_DATE) BETWEEN 1 AND 10 THEN MONTH(ADD_MONTHS(CURRENT_DATE(), -2)) ELSE MONTH(ADD_MONTHS(CURRENT_DATE(), -1)) END AS dates ;
逻辑说明
- 若当前日期的日部分在1-10区间:对当前日期做减2个月的运算后直接提取月份数字,输出数值类型,完全匹配你需要返回前2个月月份的需求
- 若当前日期的日部分大于10:对当前日期做减1个月的运算后提取月份数字,输出数值类型,和上一分支类型统一,避免类型冲突
同时该逻辑自动适配跨年场景,比如当前为1月5号时,减2个月会自动取上一年11月的月份值11,无需额外做跨年判断。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

