ORA-01843: 使用 to_date 函数时出现无效月份错误

ORA-01843: not a valid month error when using to_date function

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

有人可以帮我吗?

据我了解,您想从 sysdate 查看时间,如果是这样,您需要这个 select:

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')

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

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

你这样做根本没用。您正在分别提取 日期和时间部分 ,然后将其转换回 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: not a valid month

原因

这主要是由于 NLS 依赖性。由于您没有使用明确的 格式掩码 ,Oracle 试图根据您的 locale-specific NLS 设置.[= 隐式转换它16=]

例子

让我们更改会话的 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