在 select 查询 Oracle SQL 中格式化日期的正确方法是什么

What is the proper way of formatting date in select query Oracle SQL

假设我想要 sysdate,

SELECT SYSDATE as system_date FROM DUAL;

应按以下格式输出

14-Feb-2018 T19:50:02+00:00

DD-MMM-YYYY Thh:mm:ss+HH:MM

假设您知道日期代表 UTC 并希望固定 +00:00 部分:

select to_char(sysdate, 'DD-Mon-YYYY "T"HH24:MI:SS"+00:00"') from dual;

TO_CHAR(SYSDATE,'DD-MON-YYYY"T"HH24:
------------------------------------
14-Feb-2018 T20:13:08+00:00

格式模型元素 are in the documentation. That includes a section on character literals,我已将其用于固定的 T+00:00 部分。

正如@mathguy 所说,这似乎有点不寻常;您实际上可能将该列保留为原始日期,并拥有您的应用程序或报告工具或适合您的任何格式。这取决于您究竟在做什么,以及您是否真的想要直接从查询中获取字符串值。


由于您更新后的问题现在没有那个伪时区,现在更简单了,但思路相同:

select to_char(sysdate, 'DD-Mon-YYYY "T"HH24:MI:SS') from dual;

TO_CHAR(SYSDATE,'DD-MON-YYYY"T
------------------------------
14-Feb-2018 T20:17:50

如果您正在使用了解时区的数据类型 - 即不是普通的 DATETIMESTAMP - 您可以使用适当的模型元素将它们包含在格式中:

select to_char(systimestamp, 'DD-Mon-YYYY "T"HH24:MI:SSTZH:TZM') from dual;

TO_CHAR(SYSTIMESTAMP,'DD-MON-YYYY"T"
------------------------------------
14-Feb-2018 T20:24:58+00:00

碰巧仍然显示 +00:00 因为我的系统在英国。使用不同的值,它显示一些合适的东西:

alter session set time_zone = 'AMERICA/NEW_YORK';
select to_char(current_timestamp, 'DD-Mon-YYYY "T"HH24:MI:SSTZH:TZM') from dual;

TO_CHAR(CURRENT_TIMESTAMP,'DD-MON-YY
------------------------------------
14-Feb-2018 T15:28:57-05:00

请注意,我现在使用的是 systimestampcurrent_timestamp,它们是 TZ 感知的,而不是 sysdatecurrent_date,它们不是 - 你会得到如果您尝试从中获取 TZH 或 TZM 元素,则会出错。

您请求的格式没有多大意义。 +00:00 是时区偏移量(否则它是什么?)但是在 Oracle 中 DATE 数据类型不知道时区。只有 Oracle 数据类型 TIMESTAMP WITH TIME ZONE 应该在 Oracle 中以这种方式格式化。

以下是如何使用带时区的时间戳来完成此操作。请注意,标准 SYSTIMESTAMP 函数是一个带时区的时间戳。在下面的查询中,您可以看到时间戳是如何使用我的会话的默认值格式化的,然后使用显式格式模型。

SQL> select systimestamp,
  2         to_char(systimestamp, 'dd-Mon-yyyy "T"hh24:mi:sstzh:tzm') as ts
  3  from   dual
  4  ;

SYSTIMESTAMP                                TS
------------------------------------------- ---------------------------
14-FEB-18 12.14.18.537000 PM -08:00         14-Feb-2018 T12:14:18-08:00