старый вопрос - но не решен: нет результата SLECT * FROM table ГДЕ my_datetime_field BETWEEN начало и конец - PullRequest
0 голосов
/ 04 июня 2019

У меня есть код для запроса MariaDB с PHP 5.6.38 и PDO.База данных и код работают нормально, но если я использую оператор BETWEEN вместе с двумя DateTimes, код не дает результата - это означает, что Null - и нет Error - no Exception - всегда Null.Тип поля внутри MariaDB - DATETIME.Формат, хранящийся в БД: «2019-05-06 14:16:32».

Я испробовал много советов от stackoverflow.Проблема выглядит старой и хорошо известной, но я не нашел решения в это время.Мой текущий код выглядит следующим образом:

(пример кода для проверки проблемы с простым веб-сервером)

<?php

$cal = new Calendar();

var_dump($cal->GetDatabaseEvents('2019-06-01T00:00:00+200', '2019-06-10T23:59:59+200'));

class Calendar {

  private $dbh;

  public function __construct() {
    $this->dbh = new PDO('mysql:host=localhost;dbname=calendar', 'mytable', 'mypwd');
    $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  }


  public function GetDatabaseEvents($start, $end) {
    $sql ="SELECT id, datetime_begin FROM events WHERE datetime_begin BETWEEN '2019-06-00T00:00:00' AND '2019-06-10T23:59:59'";
    $sth = $this->dbh->prepare($sql);
    if($count = $sth->execute()) {
      while ($row = $sth->fetchObject()) {
        echo some member of $row...
      }
    } else {
      echo "SQL Error <br />";
      echo $sth->queryString."<br />";
      echo $sth->errorInfo()[2];        
    }
  }
}

нет ошибок или исключений.Все результаты равны NULL.Если я удаляю часть FROM из SQL, оператор отлично работает и дает ожидаемый результат.

Я пробовал много других приемов, таких как: а) CAST ('2019-01-05T00: 00: 00', DATE или DATETIME) или b) нет ISO DateTime, подобного этому, '2019-01-05 00:00:00 'с CAST и без CAST, или c) без BETWEEN, но (datetime_begin> = begin AND datetime_begin <= end) или d) привязка параметров, например $ sth-> bindParam (': start_date ', $ start,PDO :: PARAM_STR);

но все результаты NULL

У вас есть какие-либо предложения?

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Если ваши фактические данные «2019-05-06 14:16:32», это не МЕЖДУ «2019-06-00T00: 00: 00» И «2019-06-10T23: 59: 59»: май 6 Между 00 июня и 10 июня.

В противном случае, я скопирую вставленный твой код, изменил строку подключения, чтобы она соответствовала моей базе данных, а имя / поле таблицы соответствовало моей таблице с полем DATETIME, и это нормально работает на php 7.2.16.

Наконец, вы используете var_dump () для функции, которая ничего не возвращает, поэтому вы всегда получите NULL в качестве последней строки вашего дисплея.

0 голосов
/ 04 июня 2019

В БД хранится формат: '2019-05-06 14: 16: 32'

В базах данных хранятся значения даты / времени в формате интервал ,Это заставляет меня думать, что вы используете строку - и сравнение строк.

Меня также смущает, что вы ссылаетесь на нулевой день месяца, хотя я думаю, что MySQL / MariaDB позволяет это.

Я бы порекомендовал:

WHERE datetime_begin >= '2019-06-01' AND
      datetime_begin < '2019-06-11'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...