我正在尝试转换日期字段,但年份不正确。
我的代码是:
SELECT to_date((ADD_MONTHS(TRUNC(sysdate, 'MM'), -1) + 25), 'dd/mm/yyyy')
FROM dual
预期输出与26/02/2018
类似,但我得到26/02/0018
。
我会错过什么吗?
答案 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
是一个日期,它是正确的。问题是将日期转换为日期。