在 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
如果您正在使用了解时区的数据类型 - 即不是普通的 DATE
或 TIMESTAMP
- 您可以使用适当的模型元素将它们包含在格式中:
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
请注意,我现在使用的是 systimestamp
和 current_timestamp
,它们是 TZ 感知的,而不是 sysdate
或 current_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
假设我想要 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
如果您正在使用了解时区的数据类型 - 即不是普通的 DATE
或 TIMESTAMP
- 您可以使用适当的模型元素将它们包含在格式中:
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
请注意,我现在使用的是 systimestamp
和 current_timestamp
,它们是 TZ 感知的,而不是 sysdate
或 current_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