Snowflake日期范围查询报DATE_DIFFTIMESTAMPINMONTHS参数类型错误
报错根因
报错来自Snowflake与SQL Server的日期处理逻辑差异:
- SQL Server会将传入日期函数的数字
0隐式转换为基准日期1900-01-01,但Snowflake无此隐式转换规则,会直接将0识别为数值类型,传入DATEDIFF后就会触发(NUMBER, TIMESTAMP_LTZ)参数类型不匹配的错误。 - Snowflake的
DATEADD/DATEDIFF函数不支持mm作为月份单位的缩写,需使用标准单位标识;且SQL Server取当前时间的getdate()在Snowflake中对应CURRENT_TIMESTAMP(),返回值类型和表中assign Date (Local time)字段的TIMESTAMP_LTZ类型完全匹配。
满足需求的查询语句
固定筛选2022年5月整月的记录时,不需要使用动态相对时间逻辑,直接写明确的日期边界即可,这种写法性能最优也不会出现类型错误:
SELECT * FROM "YML"."SYNCASSIGN"."uio_faster_daily" WHERE "assign Date (Local time)" >= '2022-05-01'::TIMESTAMP_LTZ AND "assign Date (Local time)" < '2022-06-01'::TIMESTAMP_LTZ
注意:这里用小于6月1日的边界,而不是小于等于5月31日,是为了覆盖5月31日00:00:00到23:59:59.999的所有带时分秒的时间记录,避免漏数,和原SQL的边界逻辑完全一致。
如果后续需要复用原SQL「动态取当前时间上一个完整自然月」的逻辑,适配Snowflake的写法如下,需要显式声明基准日期、替换函数、调整单位参数:
SELECT * FROM "YML"."SYNCASSIGN"."uio_faster_daily" WHERE "assign Date (Local time)" >= DATEADD(month, DATEDIFF(month, '1900-01-01'::DATE, CURRENT_TIMESTAMP()) - 1, '1900-01-01'::DATE) AND "assign Date (Local time)" < DATEADD(month, 1, DATEADD(month, DATEDIFF(month, '1900-01-01'::DATE, CURRENT_TIMESTAMP()) - 1, '1900-01-01'::DATE))
内容的提问来源于stack exchange,提问作者Metacoder
相关产品推荐
相关产品推荐

