ORA-01843:使用to_date函数时没有有效的月份错误

时间:2016-01-11 08:49:49

标签: sql database oracle datetime date-formatting

SELECT sysdate as today,
       to_date(CONCAT (to_char(sysdate,'MM-DD-YYYY'),
               to_char(sysdate,'hh24:mi:ss'))) as time
FROM DUAL

每次执行此查询时,它都会给我ORA-01843: not a valid month

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

据我了解,您希望从sysdate中查看时间,如果是这样,您需要选择:

SELECT sysdate as today,
       to_char(sysdate,'MM-DD-YYYY hh24:mi:ss'))) as time
FROM DUAL

在你的例子中,错误的部分是to_date,你应该使用to_date的掩码:

to_date(CONCAT (to_char(sysdate,'MM-DD-YYYY'),
               to_char(sysdate,'hh24:mi:ss')),'MM-DD-YYYY hh24:mi:ss')

但是这将返回与sysdate完全相同,因为这两列都是日期,日期的格式取决于变量NLS_DATE_FORMAT,请检查here

答案 1 :(得分:2)

  

to_date(CONCAT(to_char(sysdate,'MM-DD-YYYY'),                  to_char(sysdate,'hh24:mi:ss')))作为时间

你在做什么根本没用。您分别提取日期和时间部分,然后将其转换回 DATE 。它只不过是 SYSDATE

如果您正在提取并显示日期和时间元素,那将是有意义的。或者,您将日期和时间分别设为字符串文字,现在您想将其转换为 DATE

例如,

SQL> alter session set nls_date_format='mm/dd/yyyy hh24:mi:ss';

Session altered.

SQL> SELECT to_date(CONCAT ('01/11/2016', '14:45:20'), 'MM/DD/YYYYHH24:MI:SS') my_date
  2  FROM DUAL;

MY_DATE
-------------------
01/11/2016 14:45:20
  

ORA-01843:不是有效月份

<强>原因

这主要是由于 NLS依赖。由于您没有使用明确的格式掩码,因此Oracle会尝试根据您的特定于语言环境的NLS设置隐式转换它。

示例

让我们改变会话的NLS格式:

SQL> alter session set nls_date_format='dd/mon/yyyyhh24:mi:ss';

Session altered.

让我们执行相同的查询:

SQL> SELECT to_date(CONCAT ('01/11/2016', '14:45:20')) my_date
  2  FROM DUAL;
SELECT to_date(CONCAT ('01/11/2016', '14:45:20')) my_date
               *
ERROR at line 1:
ORA-01843: not a valid month

正如预期的那样,它会抛出ORA-01843: not a valid month