Redshift使用COPY命令从S3加载数据时TIME列时区错误如何解决
问题根因
Redshift 使用 timeformat 'epochmillisecs' 执行COPY操作时,对TIME类型和TIMESTAMP类型的转换逻辑存在差异:
TIMESTAMP类型的转换会遵循用户/会话配置的时区规则,但TIME类型的epoch值转换会默认使用集群初始化时设置的系统默认时区,先将完整epoch值转换为对应时区的完整时间戳,再截取时间部分,因此会出现时区偏移。你执行的用户/会话时区配置仅作用于会话级时间运算、TIMESTAMP类型的转换与显示,不会影响COPY命令对TIME类型的转换逻辑,因此无法解决问题。
可行解决方案
- 方案1:将目标列类型替换为
TIMETZ(带时区的时间类型)
使用timeformat 'epochmillisecs'导入时,会自动保留UTC时区偏移,不会执行本地时区转换。如果后续需要无时区的UTC时间,可通过列名::TIME直接转换得到正确结果。 - 方案2:保留原TIME列类型,调整导入逻辑
先将epoch毫秒值导入到一个临时BIGINT类型列,再通过纯数值计算得到UTC时间,完全避开时区转换逻辑,参考SQL:UPDATE 你的表名 SET 目标时间列 = (临时epoch列 % 86400000) / 1000 * INTERVAL '1 second'; - 方案3:调整数据源导出规则
导出源数据时,提前将epoch毫秒值转换为UTC时间的字符串(格式为HH:MI:SS.fff),COPY时直接导入字符串到TIME列,不会触发时区转换。
内容的提问来源于stack exchange,提问作者expert
相关产品推荐
相关产品推荐

