无法在oracle中转换为日期

时间:2018-03-13 17:13:28

标签: sql plsql oracle11g plsqldeveloper

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

我的代码是:

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

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

我会错过什么吗?

2 个答案:

答案 0 :(得分:3)

你真的不应该在DATE数据类型值上应用TO_DATE函数,这是SYSDATE的值。

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

由于格式不正确,您可以:在演示文稿图层中,您可以使用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>

答案 1 :(得分:1)

如果您想要特定格式的日期,请使用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

是一个日期,它是正确的。问题是将日期转换为日期。