Oracle日期转PostgreSQL带时区时间戳格式转换咨询
解决Oracle日期转PostgreSQL目标时区格式的问题
针对你遇到的两个转换问题,以下是具体的解决方法:
问题1:Col_A转换后时间部分不符合预期
你当前使用的to_char(Col_A, 'YYYY-MM-DD HH:MM:SS')格式符存在错误:MM代表月份,而非分钟,这才导致时间部分显示成了月份值。正确的分钟格式符是MI,结合Col_A仅含日期的特性,你可以直接指定时间部分为00:00:00,再拼接时区标识:
-- 转换Col_A为目标格式 SELECT TO_CHAR(Col_A, 'YYYY-MM-DD 00:00:00') || '+00' AS col_a_postgres_format FROM your_table;
如果想严格基于DATE类型默认的00:00:00时间部分,也可以用正确的格式符组合:
SELECT TO_CHAR(Col_A, 'YYYY-MM-DD HH24:MI:SS') || '+00' AS col_a_postgres_format FROM your_table;
问题2:from_tz转换后带冗余微秒部分
from_tz返回的带时区时间戳默认包含微秒精度,要去掉这部分并格式化到目标格式,直接用to_char配合时区转换即可,无需单独处理微秒:
Col_B的转换方案
Col_B包含具体时间,需先转换为指定时区的时间戳,再转成UTC时区并格式化:
-- 转换Col_B为目标格式(假设原时区为+01:00,需转成UTC+00) SELECT TO_CHAR(FROM_TZ(CAST(Col_B AS TIMESTAMP), '+01:00') AT TIME ZONE 'UTC', 'YYYY-MM-DD HH24:MI:SS') || '+00' AS col_b_postgres_format FROM your_table;
SYSDATE的转换方案(你的示例场景)
针对SYSDATE的转换,同样通过to_char直接格式化:
SELECT TO_CHAR(FROM_TZ(CAST(SYSDATE AS TIMESTAMP), '+01:00') AT TIME ZONE 'UTC', 'YYYY-MM-DD HH24:MI:SS') || '+00' AS sysdate_postgres_format FROM dual;
统一说明
- 所有转换结果均为
VARCHAR2类型,完全匹配"2022-04-06 00:00:00+00"的目标格式 - 若原数据时区不是+01:00,只需替换
FROM_TZ中的时区参数为实际时区即可 HH24确保使用24小时制,避免12小时制的AM/PM歧义
内容的提问来源于stack exchange,提问作者bullfighter
相关产品推荐
相关产品推荐

