Oracle 12c中将timestamp转换为ISO-8601格式datetime的查询方法
核心概念澄清
首先你的需求存在认知偏差:Oracle 原生的DATE、TIMESTAMP类 datetime 数据类型是二进制存储结构,本身不绑定任何可读的字符串格式。你提到的18-12-2003 13:15:00、2003-12-18T13:15:00+01:00都是时间值转成字符串后的展示格式,不属于datetime类型本身的属性。
落地实现方案
场景1:需要带时区的时间类型值
如果你的核心诉求是存储/返回带欧洲时区偏移信息的时间值,不需要固定字符串格式,使用Oracle支持的TIMESTAMP WITH TIME ZONE(缩写TIMESTAMPTZ)类型即可实现:
-- 示例:将输入的字符串时间转成欧洲巴黎时区的带时区时间类型 SELECT FROM_TZ( TO_TIMESTAMP('18-12-2003 13:15:00', 'DD-MM-YYYY HH24:MI:SS'), 'Europe/Paris' -- 可替换为你需要的欧洲时区,比如Europe/Berlin、Europe/London等 ) AS european_tz_time FROM DUAL;
场景2:需要输出指定格式的字符串结果
如果你是需要输出符合你给出格式的可读字符串,可以在上述转换的基础上加上TO_CHAR函数做格式化:
SELECT TO_CHAR( FROM_TZ( TO_TIMESTAMP('18-12-2003 13:15:00', 'DD-MM-YYYY HH24:MI:SS'), 'Europe/Paris' ), 'YYYY-MM-DD"T"HH24:MI:SSTZH:TZM' ) AS formatted_european_time FROM DUAL;
上述查询的输出就是你需要的2003-12-18T13:15:00+01:00格式的字符串。
内容的提问来源于stack exchange,提问作者Ezz
相关产品推荐
相关产品推荐

