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
我创建了一个视图,其中一个列命令是:
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