ORA-01843: 数据类型转换的月份无效

ORA-01843: not a valid month with data type conversion

我创建了一个视图,其中一个列命令是:

TO_CHAR( TO_DATE(sysdate ||' '||TIMING.TIME,'dd-MON-RRRR HH:MIAM'),'dd-MON-RRRR HH:MIAM') as time

TIMING.TIME的值是这样的:09:30AM as varchar2

当我运行查询时:select TO_DATE(time,'DD-MON-RRRR HH:MIAM')from view

我收到错误

ORA-01843: not a valid month

NLS 语言是美国语言。

TO_DATE(sysdate

这是错误的。

永远不要在 DATE 数据类型上应用 TO_DATE。它迫使 Oracle:

  • 先转换成字符串
  • 然后将其转换回日期

基于区域设置特定的 NLS 设置。您需要 TO_DATE 才能将文字转换为日期。对于日期算术,将日期保留原样。

如果您尝试在当前日期配置时间部分,则: 1.先把日期转成字符串 2.然后将时间部分拼接成字符串 3.最后应用TO_DATE

例如,

SQL> alter session set nls_date_format='DD-MM-YYYY HH:MI:SS AM';

Session altered.

SQL> SELECT to_date(TO_CHAR(sysdate, 'mm/dd/yyyy')
  2    ||' '
  3    ||'09:30AM', 'mm/dd/yyyy hh:miAM') TIME
  4  FROM dual;

TIME
----------------------
14-10-2015 09:30:00 AM

记住,

  • TO_DATE用于字符串转换为日期。
  • TO_CHAR 用于显示 所需字符串格式的日期。

为您修改的查询:

to_date(TO_CHAR(sysdate, 'mm/dd/yyyy') ||' ' ||TIMING.TIME, 'mm/dd/yyyy hh:miAM')
AS "TIME"

sysdate存储时间,在拼接前最好转成char

TO_CHAR(sysdate,'dd-MON-RRRR')||' '||TIMING.TIME