首页 > 解决方案 > PDO 语句 select where date less than error

问题描述

我花了 2 天时间试图解决这个问题 - 当我尝试使用<=小于或等于运算符绑定值时,我在 MySQL 中的日期比较不起作用。

我已将其缩小到第二个日期字段(来自一个更复杂的脚本,该脚本根据请求更改准备好的语句连接/组/字段/条件..因此我指的是 table.column 并仅从一个中选择下表 - 无论哪种方式都有效)但我无法理解。用于在 php 5.x 上工作的确切代码,但我刚刚升级到 php7.2.27。

使用下面的 SQL 语句:

$sth = $this->prepare("SELECT 
                        transaction.transactionid,
                        transaction.accountid,
                        transaction.userid,
                        transaction.billdate,
                        transaction.amount,
                        transaction.description,
                        transaction.confirmed
                    FROM transaction
                    WHERE    
                        DATE(`billdate`) BETWEEN :startdate AND :enddate #date('2020-03-12')
                    ORDER BY billdate desc");    

尝试将以下内容绑定到它:

$terms = array(':startdate' => "2000-01-01",':enddate' => "2020-03-12");



foreach ($terms as $key => $value) {    
    if($value == (int)$value)
        $sth->bindValue("$key", $value, PDO::PARAM_INT);
    else
        $sth->bindValue("$key", $value);
}

var_dump($sth);
var_dump($terms);

$sth->execute();
$this->rowCount = $sth->rowCount(); 
var_dump( $sth->fetchAll(PDO::FETCH_ASSOC));

这将返回一个空数组。

该表包含少量测试行。以下正确返回:

 ... 
                DATE(`billdate`) BETWEEN :startdate AND '2020-03-12'
                ORDER BY billdate desc

将日期包裹起来 date('date')似乎没有什么区别。

这个我也试过...

  DATE(`billdate`) >= :startdate AND 
  DATE(`billdate`) <= '2020-03-12'
                ORDER BY billdate desc
                ");    

(当然,更改绑定术语,以便它们反映我正在使用的任何内容)

我需要能够绑定两个变量。

感谢任何指针,因为我希望避免浪费另一天调试这个!谢谢

标签: phpmysqldate

解决方案


只是CAST为了DATE

WHERE billdate
BETWEEN CAST(:startdate AS DATE) AND CAST(:enddate AS DATE)"

并绑定为PDO::PARAM_STR

$sth->bindValue("startdate", "2000-01-01", PDO::PARAM_STR);
$sth->bindValue("enddate", "2020-03-12", PDO::PARAM_STR);

推荐阅读