在 Oracle 中转换时区格式
Posted
技术标签:
【中文标题】在 Oracle 中转换时区格式【英文标题】:Convert timezone format in Oracle 【发布时间】:2021-12-21 07:19:15 【问题描述】:我需要将以下时区格式转换为以下格式:
输入: 2020-10-28T20:12:20.986Z
输出: 20 年 10 月 28 日晚上 8 点 12 分
我尝试了以下查询,但无法获得时间戳。请帮忙。
select TO_TIMESTAMP(SUBSTR('2020-04-21T13:02:31.259Z',1,(INSTR('2020-04-21T13:02:31.259Z', 'T') - 1)),'YYYY-MM-DD HH24:MI:SS') from dual;
【问题讨论】:
输入是时间戳还是 varchar2 列?select TO_TIMESTAMP_TZ('2020-04-21T13:02:31.259Z','YYYY-MM-DD"T"HH24:MI:SS.FF"Z"') from dual;
?
timestamp/date
数据类型没有格式。它们存储为值(当然是内部格式),客户端应用程序可以根据文化设置显示该值。如果您想在查询中将其转换为字符串(这不是一个好的设计,因为数据显示是前端应用程序的任务),然后使用显式to_char
。
【参考方案1】:
一个选项可能是这样的
SQL> alter session set nls_timestamp_format = 'dd-MON-YY hh:mi PM' ;
Session altered.
SQL> select to_timestamp('2020-10-28T20:12:20.986Z','yyyy-mm-dd"T"hh24:mi:ss.ff3"Z"') from dual ;
TO_TIMESTAMP('2020-10-28T20:12:20.986Z','YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"')
---------------------------------------------------------------------------
28-OCT-20 08:12 PM
SQL>
但是如果你更好地依赖to_timestamp
函数而不需要任何会话设置,那就更好了
SQL> select to_timestamp('2020-10-28T20:12:20.986Z','yyyy-mm-dd"T"hh24:mi:ss.ff3"Z"') from dual ;
TO_TIMESTAMP('2020-10-28T20:12:20.986Z','YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"')
---------------------------------------------------------------------------
28-OCT-20 08.12.20.986000000 PM
【讨论】:
【参考方案2】:您有一个带有时区的时间戳字符串,使用TO_TIMESTAMP_TZ
而不是TO_TIMESTAMP
,然后使用TO_CHAR
对其进行格式化:
SELECT TO_CHAR(
TO_TIMESTAMP_TZ(
'2020-04-21T13:02:31.259Z',
'YYYY-MM-DD"T"HH24:MI:SS.FFTZR'
),
'DD-MON-RR HH12:MI AM',
'NLS_DATE_LANGUAGE=American'
)
FROM DUAL;
db小提琴here
注意:DATE
、TIMESTAMP
和 TIMESTAMP WITH TIME ZONE
是二进制数据类型,存储在 7-20 个字节(世纪、世纪、月、日、小时、分和秒,然后对于 TIMESTAMP
s 的小数秒最多 6 个可选字节,对于 TIMESTAMP WITH TIME ZONE
的时区最多 7 个字节)。它从不以任何特定格式存储。
DATE
/TIMESTAMP
数据类型的显示方式取决于您用于查询数据库的客户端应用程序;有些人可能会为用户会话使用 NLS 设置,但其他人不使用它。如果您想要特定格式,则使用TO_CHAR
将DATE
/TIMESTAMP
转换为字符串。
【讨论】:
以上是关于在 Oracle 中转换时区格式的主要内容,如果未能解决你的问题,请参考以下文章