geometria
@geometria

Как выбрать дату BETWEEN датами из двух столбцов?

база данных содержит поля start_date и finish_date в формате datetime:
2020-12-01 00:00:00
2020-12-02 00:00:00
2020-12-03 00:00:00

в таблице в поле learnings.finish_date присутствуют несколько максимальных дат 05.12.2020
но запрос с одной датой (минимально ил максимальной) не отображает вообще никаких данных
с двумя датами в запросе - получаю не полные данные
$date1 = (new DateTime($_POST['date1']))->format('Y-m-d'); //на входе 05.12.2020 на выходе 2020-12-05
$date2 = (new DateTime($_POST['date2']))->format('Y-m-d');
if(empty($_POST['date2'])){
  $date2 = $date1;
}
// $date2 = 2020-12-05
$org_id = $_POST['org'];
$stmt = $dbh->prepare("SELECT collaborators.fullname, learnings.state_id, orgs.name AS orgs_name, courses.name AS courses_name
                       FROM learnings
                       LEFT JOIN collaborators ON learnings.person_id = collaborators.id
                       LEFT JOIN orgs ON collaborators.org_id = orgs.id
                       LEFT JOIN courses ON learnings.course_id = courses.id
                       WHERE collaborators.org_id = :org_id
                       AND learnings.start_date BETWEEN :date1 AND :date2
                       AND learnings.finish_date BETWEEN :date1 AND :date2");

$stmt->execute(['org_id' => $org_id, 'date1' => $date1, 'date2' => $date2]);

Подскажите, как правильно?
  • Вопрос задан
  • 75 просмотров
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Выражение BETWEEN требует указания обоих параметров, поэтому запрос с одним параметром выдаст ошибку. Самое простое - для отсутствующих параметров указывать заменители, например '1980-01-01 00:00:00' для начала и '2100-12-31 59:59:59' для конца.
Поскольку поля имеют тип DATETIME, то для поиска по датам лучше использовать форматы 'Y-m-d 00:00:00' для начала интервала и 'Y-m-d 23:59:59' для конца интервала.
Ну и в целом, ваше выражение эквивалентно
learnings.start_date >= :date1 AND learnings.finish_date <= :date2
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы