Snowflake与Python中TIMESTAMP_NTZ类型数据2023年过滤失效问题
解决Snowflake TIMESTAMP_NTZ列筛选2023年数据的问题
方案1:用日期范围直接匹配(推荐)
TIMESTAMP_NTZ类型无需额外转换,直接通过时间范围锁定2023年全年数据,这种写法性能最优,也能避免转换误差:
sf_query3 = f""" SELECT * FROM {sf_table2} INNER JOIN {sf_table1} ON {sf_table2}."product_id" = {sf_table1}."id" WHERE {sf_table2}."time" >= '2023-01-01 00:00:00' AND {sf_table2}."time" < '2024-01-01 00:00:00' """
只要时间列的值在2023年1月1日零点到2024年1月1日零点之间,都会被筛选出来,完全不受月、日、时分秒影响。
方案2:简化EXTRACT用法
原语句里把TIMESTAMP_NTZ转成DATE是多余的,直接对原列提取年份即可:
sf_query3 = f""" SELECT * FROM {sf_table2} INNER JOIN {sf_table1} ON {sf_table2}."product_id" = {sf_table1}."id" WHERE EXTRACT(YEAR FROM {sf_table2}."time") = 2023 """
TIMESTAMP_NTZ本身包含完整的年份信息,跳过DATE转换步骤能避免潜在的隐性问题,确保筛选逻辑准确。
方案3:用DATE_TRUNC截断年份
通过DATE_TRUNC把时间值截断到年份维度,再匹配2023年的起始点:
sf_query3 = f""" SELECT * FROM {sf_table2} INNER JOIN {sf_table1} ON {sf_table2}."product_id" = {sf_table1}."id" WHERE DATE_TRUNC('YEAR', {sf_table2}."time") = '2023-01-01' """
DATE_TRUNC会把所有2023年的时间统一转换成2023-01-01 00:00:00,以此为条件就能筛选出全年数据。
额外排查点
- 先确认
{sf_table2}."time"列确实是TIMESTAMP_NTZ类型,执行DESCRIBE TABLE {sf_table2};查看列的类型详情。 - 检查目标表中是否存在格式异常的时间数据,比如年份不符合4位格式的情况。
- 验证Python变量
sf_table2、sf_table1是否正确指向了预期的表,避免因表名错误导致筛选失效。
内容的提问来源于stack exchange,提问作者Aaliyah Motala
相关产品推荐
相关产品推荐

