PHP+PDO_OCI操作Oracle数据库:TO_DATE函数报错求助
解决PDO_OCI写入Oracle DATE字段时的ORA-01858错误
错误原因
你直接将TO_DATE()函数作为字符串赋值给字段变量,PDO会把整个字符串当作普通的日期值传递给Oracle。Oracle尝试解析这个字符串时,会把开头的T识别为非数字字符,不符合DATE类型的解析规则,因此抛出ORA-01858错误。
解决方案
方法1:使用参数绑定+PHP DateTime对象
PDO_OCI支持直接绑定PHP的DateTime对象,会自动转换为Oracle可识别的DATE格式,无需手动写TO_DATE:
// 构造带时间的DateTime对象 $paymentDate = new DateTime('2024-03-06 15:45:30'); // 假设是PDO预处理语句 $stmt = $pdo->prepare("UPDATE your_table SET PAYMENT_DATE = :paymentDate WHERE id = :invoiceId"); $stmt->bindParam(':paymentDate', $paymentDate, PDO::PARAM_STR); $stmt->execute([':invoiceId' => $invoiceId]);
方法2:在SQL语句中使用TO_DATE,绑定日期字符串
如果需要手动指定日期格式,把日期字符串作为参数传递,TO_DATE写在SQL语句里:
// 定义带时间的日期字符串(格式与TO_DATE的匹配) $paymentDateStr = '06/MAR/24 15:45:30'; // 预处理语句中包含TO_DATE函数 $stmt = $pdo->prepare("UPDATE your_table SET PAYMENT_DATE = TO_DATE(:paymentDate, 'dd/mon/yy HH24:MI:SS') WHERE id = :invoiceId"); $stmt->execute([':paymentDate' => $paymentDateStr, ':invoiceId' => $invoiceId]);
方法3:如果使用ORM(如你的$invoiceUpdate对象)
直接给字段赋值DateTime对象或符合Oracle默认日期格式的字符串(比如YYYY-MM-DD HH24:MI:SS),ORM会自动处理SQL转换:
$invoiceUpdate->PAYMENT_DATE = new DateTime('2024-03-06 15:45:30'); // 或者用字符串 $invoiceUpdate->PAYMENT_DATE = '2024-03-06 15:45:30'; // 执行保存操作 $invoiceUpdate->save();
内容的提问来源于stack exchange,提问作者O. Júnior
相关产品推荐
相关产品推荐

