无法在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>
我正在尝试转换日期字段,但年份不正确。
我的代码是:
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>