Snowflake中TZ格式转无毫秒时间戳结果异常求助
解决Snowflake中带时区日期转无时区时间戳的数值错误问题
问题原因
你当前的语句TO_CHAR(Time::Timestamp yyyy-mm-dd hh:mm:ss)存在两个问题:
- 语法不规范,
::Timestamp后直接跟格式字符串不符合Snowflake语法规则 - 核心问题:直接将带时区(
Z表示UTC)的字符串转换为TIMESTAMP(无时区类型)时,Snowflake会根据当前会话的时区进行转换,导致时间值发生偏移,因此数值不正确。
正确解决方案
方法1:解析为带时区时间戳后直接格式化
先将输入字符串解析为TIMESTAMP_TZ类型(保留时区信息),再指定格式输出,Snowflake会沿用原时区(UTC)的时间值:
TO_CHAR(TO_TIMESTAMP_TZ(Time), 'YYYY-MM-DD HH24:MI:SS')
方法2:显式指定输入格式(更严谨)
如果输入格式固定为带毫秒的ISO UTC格式,可显式指定解析规则避免歧义:
TO_CHAR(TO_TIMESTAMP_TZ(Time, 'YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"'), 'YYYY-MM-DD HH24:MI:SS')
方法3:转换为UTC无时区时间戳后格式化
确保最终输出为UTC时区的无时区时间戳,再进行格式化:
TO_CHAR(CONVERT_TIMEZONE('UTC', Time::TIMESTAMP_TZ)::TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS')
验证示例
输入:2018-08-12T20:17:46.384Z
使用上述任意方法,输出均为:2018-08-12 20:17:46
内容的提问来源于stack exchange,提问作者Soumik Chaudhuri
相关产品推荐
相关产品推荐

