无法在oracle中转换为日期

Not able to convert into date in oracle

我正在尝试转换日期字段,但年份不正确。

我的代码是:

SELECT to_date((ADD_MONTHS(TRUNC(sysdate, 'MM'), -1) + 25), 'dd/mm/yyyy') 
FROM dual

预期输出类似于 26/02/2018,但我得到 26/02/0018

我错过了什么吗?

如果您想要特定格式的日期,请使用 to_char():

SELECT to_char((ADD_MONTHS(TRUNC(sysdate, 'MM'), -1) + 25), 'dd/mm/yyyy') from dual

结果:

SELECT ADD_MONTHS(TRUNC(sysdate, 'MM'), -1) + 25 from dual

是一个日期而且是正确的。问题是将日期转换为日期。

您真的不应该对 DATE 数据类型值应用 TO_DATE 函数,这就是 SYSDATE。

说您必须将查询结果与另一个 DATE 数据类型值进行比较就可以了,因为您将比较两个日期。

由于您得到的格式不正确:在 presentation 层中,您将使用 TO_CHAR 函数并根据需要格式化结果;例如:

SQL> SELECT
  2    to_char((ADD_MONTHS(TRUNC(sysdate, 'MM'), -1) + 25), 'dd/mm/yyyy')  val_1,
  3    to_char((ADD_MONTHS(TRUNC(sysdate, 'MM'), -1) + 25), 'mon dd yyyy') val_2
  4  FROM dual;

VAL_1      VAL_2
---------- --------------------
26/02/2018 vel 26 2018

SQL>

请注意,这两个值都是 字符串 ,而不是日期。而且,看到一个奇怪的VAL_2月?它是克罗地亚语,但有一个解决办法:

SQL> SELECT
  2    to_char((ADD_MONTHS(TRUNC(sysdate, 'MM'), -1) + 25),
  3            'mon dd yyyy',
  4            'nls_date_language = english') val_2
  5  FROM dual;

VAL_2
--------------------
feb 26 2018

SQL>

甚至

SQL> alter session set nls_date_language = english;

Session altered.

SQL> SELECT
  2    to_char((ADD_MONTHS(TRUNC(sysdate, 'MM'), -1) + 25), 'mon dd yyyy') val_2
  3  FROM dual;

VAL_2
--------------------
feb 26 2018

SQL>

但是 - 再一次 - 这只是为了展示数据。除了删除 TO_DATE 函数外,您不应该对代码做任何事情(可选地,您可以更改会话以便按照您想要的方式查看日期,但它不会改变任何东西,除了视觉外观):

SQL> alter session set nls_date_format = 'dd/mm/yyyy';

Session altered.

SQL> select ADD_MONTHS(TRUNC(sysdate, 'MM'), -1) + 25 val_3
  2  from dual;

VAL_3
----------
26/02/2018

SQL>