Redshift转换含毫秒字符串为timestampTZ时结果异常咨询
问题解析与解决方法
这不是Redshift的bug,是格式符使用错误导致的问题:
第一个问题:执行
select to_timestamp('2023-04-12 14:29:15.352000', 'yyyy-MM-dd HH24:MI:SS')时丢失毫秒,是因为格式字符串里没有包含小数秒的匹配规则,Redshift会自动忽略字符串里的.352000部分,属于预期行为。第二个问题:用
SS.MS格式符得到错误结果,是因为Redshift中MS代表3位毫秒数,而你的字符串里是6位小数(.352000)。Redshift会把这串数字当成352000毫秒解析,352000毫秒等于5分52秒,加到原时间14:29:15上就变成了14:35:07,这才出现了时间错误。
正确的转换方式
针对6位微秒的字符串,应该用US(代表6位微秒)或者FF(匹配任意位数的小数秒)格式符:
方法1:使用US格式符
select to_timestamp('2023-04-12 14:29:15.352000', 'yyyy-MM-dd HH24:MI:SS.US');
执行后会得到正确结果:2023-04-12 14:29:15.352000 +00:00(时区显示取决于你的会话时区设置)
方法2:使用FF格式符
select to_timestamp('2023-04-12 14:29:15.352000', 'yyyy-MM-dd HH24:MI:SS.FF');
FF会自动匹配字符串中所有的小数秒位数,同样能得到正确的转换结果。
内容的提问来源于stack exchange,提问作者lollerskates
相关产品推荐
相关产品推荐

