oci_execute():ORA-01840:日期格式的输入值不够长

时间:2015-03-07 09:51:31

标签: php oracle

我目前在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();

我无法找到许多直接处理这个问题的资源。有没有人有这方面的经验?

1 个答案:

答案 0 :(得分:0)

我认为您的日期在查询中被绑定为字符串。假设您要与之比较的列(例如valid_from)是日期,则使用会话的默认日期格式将字符串值转换为日期。 SQL Developer中的行为差异可能是因为默认格式不同。

无论如何,解决方案是遵循一个非常简单而重要的规则,即不依赖于默认类型转换。将字符串显式转换为查询中的日期,并指定适当的格式:

TO_DATE( :d_valid_from, 'YYYY-MM-DD HH24:MI:SS' )