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

时间:2018-02-14 19:58:00

标签: sql oracle oracle11g date-formatting bi-publisher

假设我想要sysdate,

SELECT SYSDATE as system_date FROM DUAL;

应以下列格式输出

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

即,

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

2 个答案:

答案 0 :(得分:2)

假设您知道日期代表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。其中包括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元素。

答案 1 :(得分:2)

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

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

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
相关问题