SQL-запрос по дате и времени

Я пытаюсь сделать SQL-запрос (из PHP) для извлечения данных в зависимости от даты. Моя база данных: id (int), name (text), date (datetime)

Я искал разные способы в Интернете и в stackoverflow и протестировал следующее:

SELECT * FROM myBase WHERE date BETWEEN $date1 AND $date2

а также

SELECT * FROM myBase WHERE DATEDIFF( date, $date2 )

но ни один из них не работает

мой полный код:

    require 'connect.php'; // this connection works I can add element to the database
    $date1 = new DateTime('2018/01/01 10:00:00');
    $date2 = new DateTime('2019/01/01 10:00:00');
    $sql = "SELECT * FROM myBase WHERE date BETWEEN $date1 AND $date2";  
    //$sql = "SELECT * FROM myBase WHERE DATEDIFF(date, $date2 )";

    $req = $pdo->query($sql);  

    while($data = $req->fetch()) 
    {
        echo $data['id'];
        echo" ";
    }

Но это не работает: ничего не возвращается (конечно, в моей базе данных есть даты между date1 и date2).

Вы знаете, что не так?

Хотя конкретная ошибка заключается в отсутствии кавычек, в более общем плане, написание запросов таким образом оставляет вас широко открытыми для внедрения sql. См. О параметризованных запросах

Strawberry 25.07.2018 15:56

SELECT * FROM myBase WHERE date BETWEEN $ date1 AND $ date2 разве этот оператор не возвращает никаких результатов непосредственно из базы данных?

Zaynul Abadin Tuhin 25.07.2018 16:03

вы заявляете, что сохраняете его как "bookingDate", но запрашиваете "дату". Если это первое, то ваш запрос должен сравнить bookingDate

nomistic 25.07.2018 16:06

@ Зайнул Абадин Тухин: ничего не возвращается

Freddlow 25.07.2018 16:07

@nomistic: извините bookingDate - это не настоящее имя, это дата - я исправляю вопрос

Freddlow 25.07.2018 16:08

получаете ли вы какие-либо результаты, когда выполняете запрос непосредственно в своей базе данных? Другими словами, SELECT * FROM myBase WHERE date BETWEEN '2018/01/01 10:00:00' AND '2019/01/01 10:00:00', и если это так, если он там работает, попробуйте то же самое в своем запросе на странице, передав ему фактические значения.

nomistic 25.07.2018 16:12

@Freddlow sqlfiddle.com/#!9/cfce1c/1 проверьте эту ссылку и не увидите разницы между вашим запросом и запросом на ссылку Think, теперь, если этот запрос сработал хорошо, то почему не ваш

Zaynul Abadin Tuhin 25.07.2018 19:59
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
7
72
3

Ответы 3

Вы можете указать, что дата должна быть больше date1 и меньше date2:

SELECT * FROM myBase WHERE date >= $date1 AND date <= $date2

также, как правильно заявила Строберри, используйте этот код для безопасной вставки параметров:

$query = "SELECT * FROM myBase WHERE date >= :start AND date <= :end";

Итак, ваш код должен быть:

try{
    $req= $db->prepare($query);
    $result = $req->execute(array(
        'start'=>$date1->format('Y-m-d'), 
        'end'=>$date2->format('Y-m-d')
    ));
    $id_contratto = $db->lastInsertId();
}catch(PDOException $ex){
    //handle errors here
}

while($data = $req->fetch()) 
{
    echo $data['id'];
    echo" ";
}

дает тот же результат

Freddlow 25.07.2018 16:00

как дата определяется в вашей базе данных? Разве это не должно быть "bookingDate"?

fabio.ivona 25.07.2018 16:01

Кроме того, вы должны отформатировать дату в формате MySql: $ date1-> format ('Y-m-d'), просто отредактировал мой ответ, чтобы отразить это

fabio.ivona 25.07.2018 16:03

Тот же формат, что и date1 et date2. Я заполнил таблицу запросом типа $ sql = "INSERT INTO myBase VALUES ('John', 'Doe', 5, '2018/08/26 09:20:00', '2018/08/27 10:10:00 ') ";

Freddlow 25.07.2018 16:03

это неправильный формат даты, вы должны вставить его как: 2018-08-26

fabio.ivona 25.07.2018 16:06

и если у вас есть это [id (int), name (text), bookingDate (datetime)], почему ваш оператор вставки содержит две даты?

fabio.ivona 25.07.2018 16:06

извините, у меня есть другие даты в моей базе данных, но я их еще не использую

Freddlow 25.07.2018 16:17

Вы пытались исправить формат даты как 2018-08-26?

fabio.ivona 25.07.2018 16:49

похоже, что запросы неверны

SELECT * FROM myBase WHERE bookingDate BETWEEN $date1 AND $date2";  

или же

SELECT * FROM myBase WHERE DATEDIFF( BookingDate, $date2 ) > 0

тот же результат, ничего не вернулось

Freddlow 25.07.2018 16:16

Нет проблем с вашим запросом, но с $ date1 и $ date2. $ Date1 и $ date2 просто сохраняются как строковый формат. $ date1 = '2018-01-01 10:00:00'; $ date2 = '2019-01-01 10:00:00';

Это делает ошибку. В моей таблице даты указаны в формате datetime

Freddlow 25.07.2018 16:21

Да, в БД дата должна быть сохранена как datetime. Какой тип SQL вы используете? SQL-сервер, MySQL или ...? В чем ошибка? как выглядит окончательная строка запроса

Climber 25.07.2018 16:32

Я использую MySQL (с PHPMyAdmin). Когда у меня возникает ошибка, моя страница PHP, которая выполняет запрос, не может отображаться

Freddlow 25.07.2018 16:38

Как насчет обновления формата даты с помощью разделителя тире. Как SELECT * FROM myBase WHERE date BETWEEN '2018-01-01 10:00:00' AND '2019-01-01 10:00:00'

Climber 25.07.2018 16:57

Другие вопросы по теме