ORA-01843 -不是一个有效的月oracle SQL


ORA-01843 - not a valid month oracle SQL

下面我试图从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列没有定义为 DATE ,而是定义为其他数据类型(例如VARCHAR),

对于OP查询,Oracle正在执行隐式的数据类型转换,将COP_WEEK列中的值从VARCHAR转换为DATE。隐式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,但这将不仅仅是更改代码。