TO_CHAR和TO_DATE给出不同的结果。如何使用TO_DATE实现TO_CHAR功能?

时间:2016-02-10 08:03:17

标签: sql oracle date-formatting to-date to-char

SELECT TO_CHAR((select logical_date -1 from logical_date 
where logical_date_type='B'),'DD/MM/YYYY HH24:MI:SS') FROM DUAL;

此查询返回23/04/2016 00:00:00

o/p of select logical_date -1 from logical_date where logical_date_type='B' :4/23/2016

SELECT TO_DATE((select logical_date -1 from logical_date 
where logical_date_type='B'),'DD/MM/YYYY HH24:MI:SS') FROM DUAL;

此查询返回4/23/0016

如何使用TO_DATE ??

获取TO_CHAR给出的格式

3 个答案:

答案 0 :(得分:6)

日期没有任何内在格式。 Oracle有一个内部表示,看起来不像你认为的任何日期。客户端或应用程序决定如何显示日期(例如,使用NLS_DATE_FORMAT),或者您可以使用TO_CHAR将日期转换为具有您指定格式的字符串,就像您在第一个示例中所做的那样。

在你的第二个例子中,你正在使用你的NLS设置将你的实际日期隐式转换为字符串 - 在这个过程中失去了世纪,所以可能是YY而不是YYYY - 然后你将它转换回一个日期。我很惊讶,因为你正在交换月和日的位置,所以没有错误。

不要那样做。即使您的设置在途中没有丢失信息,转换为字符串并返回日期也毫无意义。

如果您希望将其作为客户或其他流程的日期,请执行以下操作:

select logical_date -1
from logical_date 
where logical_date_type='B'

如果您想与另一个日期进行比较,请将其保留为日期:

select other_columns
from logical_date 
where logical_date_type='B'
and logical_date -1 < sysdate

如果您想指定格式,请使用:

select to_char(logical_date -1, 'DD/MM/YYYY')
from logical_date 
where logical_date_type='B'

答案 1 :(得分:3)

问题与您在oracle客户端设置中配置的会话的默认日期格式有关 检查会话的NLS_DATE_FORMAT设置

SELECT value
FROM   nls_session_parameters
WHERE  parameter = 'NLS_DATE_FORMAT'

此处了解如何更改会话的此设置以获得所需的结果:

alter session set nls_date_format='DD/MM/YYYY HH24:MI:SS';

答案 2 :(得分:3)

  

如何使用TO_DATE获取TO_CHAR给出的格式?

首先, DATE 没有任何格式。 Oracle不会以您看到的格式存储日期。它在内部以 7字节存储它,每个字节存储d atetime 值的不同组件。

Byte    Description
----    -------------------------------------------------
1       Century value but before storing it add 100 to it
2       Year and 100 is added to it before storing
3       Month
4       Day of the month
5       Hours but add 1 before storing it
6       Minutes but add 1 before storing it
7       Seconds but add 1 before storing it

格式仅适用于显示目的。 TO_DATE 用于将文字转换为日期,与格式无关。要以所需格式显示日期,请使用 TO_CHAR 和正确的 FORMAT MODEL

另外,请记住,格式设置具有优先顺序

让我们看一下时间顺序优先顺序,即从最高到最低:

  • 个人SQL语句

  • 中使用 TO_CHAR TO_DATE
  • ALTER SESSION SET NLS_DATE_FORMAT=’whatever format model you want’;

  • 客户端计算机上将其设置为操作系统环境变量

  • NLS_DATE_FORMAT的设置位于数据库初始化参数

例如,

个人SQL语句:

SQL> SELECT HIREDATE, TO_CHAR(hiredate, 'YYYY-MM-DD') FROM emp;

HIREDATE            TO_CHAR(HI
------------------- ----------
17/12/1980 00:00:00 1980-12-17
20/02/1981 00:00:00 1981-02-20
22/02/1981 00:00:00 1981-02-22
02/04/1981 00:00:00 1981-04-02
28/09/1981 00:00:00 1981-09-28
01/05/1981 00:00:00 1981-05-01
09/06/1981 00:00:00 1981-06-09
09/12/1982 00:00:00 1982-12-09
17/11/1981 00:00:00 1981-11-17
08/09/1981 00:00:00 1981-09-08
12/01/1983 00:00:00 1983-01-12
03/12/1981 00:00:00 1981-12-03
03/12/1981 00:00:00 1981-12-03
23/01/1982 00:00:00 1982-01-23

14 rows selected.

会话级别:

SQL> alter session set nls_date_format='YYYY-MM-DD';

Session altered.

SQL> SELECT hiredate FROM emp;

HIREDATE
----------
1980-12-17
1981-02-20
1981-02-22
1981-04-02
1981-09-28
1981-05-01
1981-06-09
1982-12-09
1981-11-17
1981-09-08
1983-01-12
1981-12-03
1981-12-03
1982-01-23

14 rows selected.

SQL>
  

TO_DATE((选择logical_date

这是错误的。

永远不要在 DATE 列上应用 TO_DATE 。它迫使Oracle:

  • 首先将其转换为字符串
  • 然后将其转换回日期

基于区域设置特定的NLS设置。您需要 TO_DATE 才能将文字转换为日期。对于日期算术,请保留日期。