在 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


注意:DATETIMESTAMPTIMESTAMP WITH TIME ZONE 是二进制数据类型,存储在 7-20 个字节(世纪、世纪、月、日、小时、分和秒,然后对于 TIMESTAMPs 的小数秒最多 6 个可选字节,对于 TIMESTAMP WITH TIME ZONE 的时区最多 7 个字节)。它从不以任何特定格式存储。

DATE/TIMESTAMP 数据类型的显示方式取决于您用于查询数据库的客户端应用程序;有些人可能会为用户会话使用 NLS 设置,但其他人不使用它。如果您想要特定格式,则使用TO_CHARDATE/TIMESTAMP 转换为字符串。

【讨论】:

以上是关于在 Oracle 中转换时区格式的主要内容,如果未能解决你的问题,请参考以下文章

需要在 oracle 中将任何时区转换为 GMT 时区

Oracle 将带有时区的 TIMESTAMP 转换为 DATE

在 oracle 中转换时区?

如何在 oracle 触发器中转换日期类型变量的时区

Java时间格式转换,如何获得时区?

js 如何把一个本地时间 转换为其他时区的时间