AWS Athena Iceberg:将带时区的时间戳字符串转为时间戳列
最优转换方案
针对你提供的带时区ISO8601格式字符串,要无损转换为UTC时区的timestamp(6) with time zone类型,分两种常用环境给出最优方法:
Spark SQL 环境
直接使用to_timestamp_tz解析带时区的时间字符串,再通过AT TIME ZONE 'UTC'转换为UTC时区的带时区时间戳,完美保留6位小数精度:
SELECT to_timestamp_tz('2024-02-28T14:26:51.292534-03:00') AT TIME ZONE 'UTC' AS converted_time, typeof(to_timestamp_tz('2024-02-28T14:26:51.292534-03:00') AT TIME ZONE 'UTC') AS type_info;
执行后输出完全符合你的期望:
data: 2024-02-28 17:26:51.292534 UTC
typeof: timestamp(6) with time zone
你之前尝试的方法无效的原因:
from_iso8601_timestamp:Spark中该函数返回不带时区的TimestampType,无法保留时区偏移信息,自然无法得到带时区的目标类型。cast as timestamp(6):直接转换不会识别字符串中的时区部分,仅解析时间文本,导致时区信息丢失,结果不符合要求。parse_datetime:默认返回不带时区的时间戳,且需手动指定格式,容易因格式匹配误差导致解析失败。
PostgreSQL 环境
如果使用PostgreSQL,用to_timestamp解析字符串后转换为UTC时区即可:
SELECT to_timestamp('2024-02-28T14:26:51.292534-03:00') AT TIME ZONE 'UTC' AS converted_time, pg_typeof(to_timestamp('2024-02-28T14:26:51.292534-03:00') AT TIME ZONE 'UTC') AS type_info;
内容的提问来源于stack exchange,提问作者Guilherme Noronha
相关产品推荐
相关产品推荐

