我目前在php中收到了来自oci的以下错误消息(我已经使用了几个小时)。
oci_execute(): ORA-01840: input value not long enough for date format
很奇怪,因为当我在SQL Developer中运行查询时,它似乎工作正常。
这让我觉得当我绑定参数时,它会将日期转换为无法使用oracle中的常规运算符计算的类型。
$startDateTime = '2015-03-06 00:00:00';
$endDateTime = '2015-04-06 00:00:00';
$value = '20';
$type = '$';
$SQL = "SELECT count(*) AS \"COUNT\"
FROM bonus where value = :d_value
AND TYPE = :d_type
AND ((:d_valid_from between valid_from AND valid_till) OR (:d_value_till between valid_from AND valid_till) OR (:d_valid_from < valid_from AND valid_till < :d_valid_till))";
$this->stmnt = $this->conn->prepare($SQL);
$this->stmnt->bindParam('d_valid_from', $startDateTime);
$this->stmnt->bindParam('d_valid_till', $endDateTime);
$this->stmnt->bindParam('d_value', $value);
$this->stmnt->bindParam('d_type', $type);
$this->stmnt->execute();
我无法找到许多直接处理这个问题的资源。有没有人有这方面的经验?
答案 0 :(得分:0)
我认为您的日期在查询中被绑定为字符串。假设您要与之比较的列(例如valid_from
)是日期,则使用会话的默认日期格式将字符串值转换为日期。 SQL Developer中的行为差异可能是因为默认格式不同。
无论如何,解决方案是遵循一个非常简单而重要的规则,即不依赖于默认类型转换。将字符串显式转换为查询中的日期,并指定适当的格式:
TO_DATE( :d_valid_from, 'YYYY-MM-DD HH24:MI:SS' )