Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在select查询Oracle SQL中格式化日期的正确方法是什么_Sql_Oracle_Oracle11g_Date Formatting_Bi Publisher - Fatal编程技术网

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

在select查询Oracle SQL中格式化日期的正确方法是什么,sql,oracle,oracle11g,date-formatting,bi-publisher,Sql,Oracle,Oracle11g,Date Formatting,Bi Publisher,假设我想要sysdate SELECT SYSDATE as system_date FROM DUAL; 应以以下格式输出 14-Feb-2018 T19:50:02+00:00 i、 e 假设您知道日期代表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: --------------

假设我想要sysdate

SELECT SYSDATE as system_date FROM DUAL;
应以以下格式输出

14-Feb-2018 T19:50:02+00:00
i、 e

假设您知道日期代表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
设置模型元素的格式。这包括关于的一节,我在固定的
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

如果您使用的数据类型了解时区,即不是普通的
日期
时间戳
,则可以使用适当的模型元素将其包含在格式中:

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\u timestamp
,它们是TZ感知的,而不是
sysdate
current\u date
,它们不是-如果您试图从中获取TZH或TZM元素,您将得到一个错误。

假设您知道日期代表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
设置模型元素的格式。这包括关于的一节,我在固定的
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

如果您使用的数据类型了解时区,即不是普通的
日期
时间戳
,则可以使用适当的模型元素将其包含在格式中:

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\u timestamp
,它们是TZ感知的,而不是
sysdate
current\u date
,它们不是——如果您试图从它们中获取TZH或TZM元素,您将得到一个错误。

您请求的格式没有多大意义+00:00是时区偏移量(否则是什么?),但在Oracle中,日期数据类型不知道时区。在Oracle中,只有带时区的Oracle数据类型时间戳才应采用这种格式

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

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

您请求的格式没有多大意义+00:00是时区偏移量(否则是什么?),但在Oracle中,日期数据类型不知道时区。在Oracle中,只有带时区的Oracle数据类型时间戳才应采用这种格式

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

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


那很好。这是默认值。对不起,我可能不清楚。我希望输出采用指定的格式。如何实现?您想要什么格式?Oracle中没有
MMM
format模型元素;要获得Feb,应该使用元素
Mon
。然后,不要在分钟内使用
mm
mm
mm
mm
表示月份
mi
mi
是分钟。然后
hh
不完整-对于24小时制,它应该是
hh24
,或者
hh。。。AM
表示AM/PM符号;你可能想要
hh24
。那很好。这是默认值。对不起,我可能不清楚。我希望输出采用指定的格式。如何实现?您想要什么格式?Oracle中没有
MMM
format模型元素;要获得Feb,应该使用元素
Mon
。然后,不要在分钟内使用
mm
mm
mm
mm
表示月份
mi
mi
是分钟。然后
hh
不完整-对于24小时制,它应该是
hh24
,或者
hh。。。AM
表示AM/PM符号;您可能需要
hh24
。您好。非常感谢您抽出时间。我发布了最终的格式。你能查一下吗again@saint1729-您现在已将固定的+00:00更改为+HH:MM,这意味着时区可变。但是
日期
没有时区组件。那么,您真正使用的是什么数据类型呢?那么,什么数据类型包含时区组件呢。我希望输出是这样的。您可以相应地更改查询吗?我已经这样做了,但是datetime column.variable/您要转换为字符串的任何内容都必须是了解时区的数据类型才能工作。使用
sysdate
将不起作用。@saint1729-您了解数据类型和格式之间的区别吗?它们是非常不同的概念。如果您的数据使用日期类型,则无法将其格式化为包含时区信息,因为Oracle日期数据类型根本不是这样设计/实现的。Hi。非常感谢您抽出时间。我张贴了最后的表格