Snowflake SQL中convert_timezone搭配timediff计算时间差返回0问题
Snowflake时区差计算为0问题原因分析
原查询SQL如下:
select convert_timezone('America/Los_Angeles', CURRENT_TIMESTAMP()), convert_timezone('America/Chicago', CURRENT_TIMESTAMP()), timediff(hour, convert_timezone('America/Los_Angeles', CURRENT_TIMESTAMP()), convert_timezone('America/Chicago', CURRENT_TIMESTAMP()) ) as a;
这个问题的核心是Snowflake中TIMESTAMP_TZ(带时区时间戳)类型的存储与计算逻辑导致的:
CURRENT_TIMESTAMP()返回的是TIMESTAMP_TZ类型,该类型底层存储标准UTC时间戳,附带的时区元数据仅用于将UTC时间转换为对应时区的当地时间展示,不会改变底层UTC值。CONVERT_TIMEZONE函数处理TIMESTAMP_TZ类型输入时,仅调整附带的时区元数据和展示用的当地时间格式,底层存储的UTC时间戳完全不变。你看到的两地显示时间差2小时只是展示层面的差异,两个转换后的值对应的是同一个物理时间点。TIMEDIFF计算两个TIMESTAMP_TZ类型的差值时,会直接取两者的底层UTC时间戳做对比,两个完全相同的UTC时间的小时差自然为0。
如果需要得到两地当地时间的差值,只需要将转换后的结果强制转换为不带时区的TIMESTAMP_NTZ类型,让计算基于展示的当地时间进行即可,参考修改后的SQL:
select convert_timezone('America/Los_Angeles', CURRENT_TIMESTAMP())::TIMESTAMP_NTZ, convert_timezone('America/Chicago', CURRENT_TIMESTAMP())::TIMESTAMP_NTZ, timediff(hour, convert_timezone('America/Los_Angeles', CURRENT_TIMESTAMP())::TIMESTAMP_NTZ, convert_timezone('America/Chicago', CURRENT_TIMESTAMP())::TIMESTAMP_NTZ ) as a;
内容的提问来源于stack exchange,提问作者ebramos
相关产品推荐
相关产品推荐

