Оператор PDO выбрать, где дата меньше, чем ошибка - PullRequest
0 голосов
/ 07 февраля 2020

Я потратил 2 дня, пытаясь это исправить - мои сравнения дат в MySQL не работают, когда я пытаюсь связать значения с оператором <= меньше или равно.

Я сузил его до второго поля даты (из гораздо более сложного скрипта, который изменяет подготовленный оператор, присоединяет / groups / fields / условий в зависимости от запроса ... вот почему я ссылаюсь на таблицу. столбец и выбор только из одной таблицы ниже - это работает в любом случае), но я не могу понять это. Точный код, используемый для работы с 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
                ");    

(Конечно, изменяя связанные термины, чтобы они отражали то, что я использую)

Мне нужно иметь возможность связывать обе переменные.

Благодарен за любые указатели, которых я бы хотел избежать тратить еще один день на отладку этого! Спасибо

1 Ответ

1 голос
/ 07 февраля 2020

Просто 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);
...