求Oracle数据库中TIMESTAMP值从AEST转换为UTC的SQL查询语句
AEST转UTC的SQL查询方案
你的问题核心是输入的时间字符串没有时区标识,导致TO_UTC_TIMESTAMP_TZ无法正确解析。需要先将字符串转换为带AEST时区的时间戳,再转换为UTC时区,最后格式化输出。
方法一:使用TO_TIMESTAMP_TZ + SYS_EXTRACT_UTC
先解析字符串为AEST时区的时间戳,再提取UTC时间,最后格式化输出:
SELECT TO_CHAR( SYS_EXTRACT_UTC( TO_TIMESTAMP_TZ('15/MAR/24 05:23:17.148565000 AM', 'DD/MON/RR HH:MI:SS.FF9 AM', 'NLS_DATE_LANGUAGE=ENGLISH') ), 'DD/MON/RR HH:MI:SS.FF9 AM', 'NLS_DATE_LANGUAGE=ENGLISH' ) AS utc_time FROM DUAL;
TO_TIMESTAMP_TZ:按指定格式解析输入字符串,NLS_DATE_LANGUAGE=ENGLISH确保月份缩写(MAR)被正确识别SYS_EXTRACT_UTC:从带时区的时间戳中提取UTC时间TO_CHAR:将UTC时间格式化为你需要的输出样式
方法二:使用TO_TIMESTAMP_TZ + AT TIME ZONE
通过时区转换语法直接切换到UTC:
SELECT TO_CHAR( TO_TIMESTAMP_TZ('15/MAR/24 05:23:17.148565000 AM', 'DD/MON/RR HH:MI:SS.FF9 AM', 'NLS_DATE_LANGUAGE=ENGLISH') AT TIME ZONE 'UTC', 'DD/MON/RR HH:MI:SS.FF9 AM', 'NLS_DATE_LANGUAGE=ENGLISH' ) AS utc_time FROM DUAL;
适配TO_UTC_TIMESTAMP_TZ的写法
如果一定要用TO_UTC_TIMESTAMP_TZ,需要在输入字符串中添加AEST的时区偏移(+10:00),并在格式串中包含时区标识:
SELECT TO_CHAR( TO_UTC_TIMESTAMP_TZ('15/MAR/24 05:23:17.148565000 AM +10:00', 'DD/MON/RR HH:MI:SS.FF9 AM TZH:TZM', 'NLS_DATE_LANGUAGE=ENGLISH'), 'DD/MON/RR HH:MI:SS.FF9 AM', 'NLS_DATE_LANGUAGE=ENGLISH' ) AS utc_time FROM DUAL;
注意事项
- 如果涉及夏令时,建议使用时区名
'Australia/Sydney'代替固定偏移+10:00,数据库会自动处理夏令时转换:TO_TIMESTAMP_TZ('15/MAR/24 05:23:17.148565000 AM', 'DD/MON/RR HH:MI:SS.FF9 AM', 'NLS_DATE_LANGUAGE=ENGLISH') AT TIME ZONE 'Australia/Sydney'
内容的提问来源于stack exchange,提问作者Sudatta Dash
相关产品推荐
相关产品推荐

