You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 08:30:03