Php oci_execute():ORA-01840:输入值不够长,不适合日期格式

Php oci_execute():ORA-01840:输入值不够长,不适合日期格式,php,oracle,Php,Oracle,我目前收到来自oci的以下php错误消息(我已经使用它几个小时了) 这很奇怪,因为当我在SQLDeveloper中运行查询时,它似乎工作得很好 这让我觉得,当我绑定参数时,它正在将日期转换为无法使用oracle中的常规运算符计算的类型 $startDateTime = '2015-03-06 00:00:00'; $endDateTime = '2015-04-06 00:00:00'; $value = '20'; $type = '$'; $SQL = "SELECT count(*) A

我目前收到来自oci的以下php错误消息(我已经使用它几个小时了)

这很奇怪,因为当我在SQLDeveloper中运行查询时,它似乎工作得很好

这让我觉得,当我绑定参数时,它正在将日期转换为无法使用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();
$startDateTime='2015-03-06 00:00:00';
$endDateTime='2015-04-06 00:00:00';
$value='20';
$type='$';
$SQL=“选择计数(*)作为\“计数”
来自奖金,其中值=:d_值
和类型=:d_类型
和(:d_valid_from valid_from AND valid_till之间)或(:d_value_till valid_from AND valid_till之间)或(:d_valid_fromstmnt=$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();

我找不到很多直接处理php的资源来解决这个问题。有人对此有经验吗?

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

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

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