ORA-01843无效月份 - 比较日期

Dav*_*073 21 sql oracle select date

尝试从按日期过滤的表中选择数据时出现问题.例如:

SELECT*FROM MYTABLE WHERE MYTABLE.DATEIN = '23/04/49';

Oracle错误是:

SELECT * FROM MYTABLE WHERE MYTABLE.DATEIN = '23/04/49';
Run Code Online (Sandbox Code Playgroud)

表格的源数据可能已损坏,在这种情况下:我该如何解决这个问题?我可以将此日期更改为null吗?

这个选择的结果,从nls_session_parameters中选择*; ,是:

Informe de error:
Error SQL: ORA-01843: mes no válido
01843. 00000 -  "not a valid month"
*Cause:    
*Action:
Run Code Online (Sandbox Code Playgroud)

谢谢!

小智 28

您应该使用to_date函数http://www.techonthenet.com/oracle/functions/to_date.php

SELECT * FROM MYTABLE WHERE MYTABLE.DATEIN = TO_DATE('23/04/49', 'DD/MM/YY');
Run Code Online (Sandbox Code Playgroud)

  • 我会说:应该使用.比较日期时始终使用格式.否则它会在某个系统上出错. (6认同)

Mur*_*nik 9

您正在将日期列与字符串文字进行比较.在这种情况下,Oracle会尝试使用默认日期格式将您的文字转换为日期.依赖这种行为是一种不好的做法,因为如果DBA更改某些配置,Oracle会在未来版本中破坏某些内容,则此默认值可能会发生变化,等等.

相反,您应该始终将文字显式转换为日期并说明您正在使用的格式:

SELECT * FROM MYTABLE WHERE MYTABLE.DATEIN = TO_DATE('23/04/49','MM/DD/YY');
Run Code Online (Sandbox Code Playgroud)


Piy*_*iya 5

如果您不需要检查确切的时间戳,请使用

SELECT * FROM MYTABLE WHERE trunc(DATEIN) = TO_DATE('23-04-49','DD-MM-YY');
Run Code Online (Sandbox Code Playgroud)

否则,您可以使用

SELECT * FROM MYTABLE WHERE DATEIN = TO_DATE('23-04-49 20:18:07','DD-MM-YY HH24:MI:SS');
Run Code Online (Sandbox Code Playgroud)

在这里,您使用硬编码日期,如果直接比较,则必须使用DD-MM-YY HH24:MI:SS,否则可能会收到ORA-01849:小时必须在1到12之间。