下面我试图从oracle数据库中提取信息。但是,我一直收到这个错误:
Warning: oci_execute(): ORA-01843: not a valid month
为什么我的代码会发布此错误? TIA!
代码:
$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
这使我更加困惑,因为我的格式与数据库中的格式完全相同。
答案 0 :(得分:1)
最可能的解释是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,但这不仅仅是对代码的更改。