ORA-01843 - 不是有效的月份 oracle SQL

Posted

技术标签:

【中文标题】ORA-01843 - 不是有效的月份 oracle SQL【英文标题】:ORA-01843 - not a valid month oracle SQL 【发布时间】:2014-08-05 19:49:37 【问题描述】:

下面我试图从 oracle 数据库中提取信息。但是,我不断收到此错误:

Warning: oci_execute(): ORA-01843: not a valid month

为什么我的代码会发布此错误?蒂亚!

代码:

$objConnect = oci_connect("user", "password", "(description=(address=(protocol=tcp)(host=host)(port=1533))(connect_data=(service_name=sid)))");
$weekSQL2 =  "SELECT * FROM INTOXDM.LSS_COP WHERE COP_WEEK = to_date('2014-08-06 00:00:00', 'yyyy-mm-dd HH24:MI:SS')";
$weekParse2 = oci_parse($objConnect, $weekSQL2);  
$weekExecute2 = oci_execute($weekParse2);
$week2 = oci_fetch_all($weekParse2,$week12);

注意

这是我的数据库中日期的样子:

2014-06-23 00:00:00.0

这更让我困惑,因为我的格式与数据库中的格式完全相同。

【问题讨论】:

COP_WEEK的类型是什么?也许这就是你得到错误的地方。 【参考方案1】:

最可能的解释是COP_WEEK列没有定义为DATE,而是其他一些数据类型(例如VARCHAR),

对于 OP 查询,Oracle 正在对COP_WEEK 列中的值执行隐式 数据类型转换,从VARCHARDATE。隐式TO_DATE 转换使用客户端NLS_DATE_FORMAT 变量中指定的格式,可能是默认'DD-MON-RR'。不管它是什么,它都不会“匹配”列中存储的内容。

或者,如果 NLS_DATE_FORMAT 确实匹配列中存储的大多数值,则至少有一个 COP_WEEK 值与格式不匹配。


一个代码“修复”(我把它放在引号中,因为它不是真正正确的修复)是使用 TO_DATE 函数使转换显式:

WHERE TO_DATE(COP_WEEK,'yyyy-mm-dd HH24:MI:SS') = 

代码“修复”的另一个选项是将裸 VARCHAR 列与 VARCHAR 文字进行比较

WHERE COP_WEEK = '2014-08-06 00:00:00.0'

这样做的好处是允许 Oracle 使用索引,而不是要求对每一行进行转换...


更好的选择是将 COP_WEEK 存储为 DATE 数据类型,而不是 VARCHAR,但这不仅仅是对代码的更改。

【讨论】:

由于 OP 在 WHERE 子句中具有相等性,如果 COP_WEEKVARCHAR,则无需将任何内容转换为日期。当然,最好的选择是使用实际的 DATE 数据类型。 @WW:同意。我确实建议将其作为可能的代码“修复”。我首先进行了显式 TO_DATE 转换;主要是因为这有助于解释现有查询抛出异常的原因。如果提供格式与该列中存储的至少一个值不匹配,我们会在显式 TO_DATE 中得到相同的错误。 谢谢你的帮助,我刚把它从DATE数据类型改成VARCHAR,因为我太糊涂了哈哈

以上是关于ORA-01843 - 不是有效的月份 oracle SQL的主要内容,如果未能解决你的问题,请参考以下文章

cx_Oracle.DatabaseError: ORA-01843: 不是一个有效的月份

ORA-01843 不是有效月份 - 比较日期

应用程序错误:ORA-19202:XML 处理中发生错误 ORA-01843:不是有效月份 - Oracle Apex

插入表返回 ORA-01843:不是有效月份

“ORA-01843: 不是一个有效的月份”错误

SQL 错误:ORA-01843:不是有效月份