@Emmet1

Как правильно задать SQL запрос к БД, чтобы получить в заданном интервале?

Доброго времени суток!

Ситуация такова. Есть сайт с курсами. Курсы записаны в бд. У них есть поля start_event (начало курса) и end_event (окончание курса).

Мне нужно отправить запрос к бд где у меня есть две известные переменные переменные data_start = начало и data_end = конец.
Задача в том, чтобы имея эти переменные получить из БД все курсы, продолжительность которых попадает в этот интервал.
То есть, если человек ввек 15.11.2020 и 20.11.2020 ему должно выдать все курсы ,которые проходят в этом промежутке.

Спасибо!
  • Вопрос задан
  • 597 просмотров
Решения вопроса 1
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
1. Запрос к БД зависит от того в каком формате у вас хранятся даты в БД (DATETIME, TIMESTAMP/int() или не дай боже varchar)
2. Данные которые прислал пользователь скорее всего нужно будет перобразовать (DateTime, strtotime()), прежде чем отправлять запрос в БД.

Для DATETIME или TIMESTAMP запрос будет:

SELECT * FROM courses 
WHERE 
    ( start_event BETWEEN $data_start AND  $data_end ) AND
    ( end_event BETWEEN $data_start AND  $data_end )


Или то же самое без BETWEEN
SELECT * FROM courses 
WHERE 
    ( start_event >= $data_start AND start_event <= $data_end ) AND
    ( end_event >= $data_start AND end_event <= $data_end )
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Pro_Code
Думаю, нужно выборку делать из БД. Что-то вроде "SELECT * FROM someTable WHERE
date = 10.10.2020 AND date = 11.10.2020"(Знаки больше или меньше вместо равно, не помню). Предварительно шаманить с датами что-то, чтобы правильно их на базу отправить.На PHP будет выглядеть как-то так:
$dsn = 'mysql:host=my_host;dbname=my_dbname';
$user = 'user_name';
$pass = 'password';
$opt = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //FETCH_NAMED; FETCH_NUM;
    PDO::ATTR_EMULATE_PREPARES   => false,
];

$pdo = new PDO($dsn, $user, $pass, $opt);

global $data;

$param1 = $_POST['date1'];
$param2 = $_POST['date2'];
 $stmt = $pdo->prepare("SELECT * FROM catalog WHERE param1 = ? AND param2 = ?");
if ($stmt->execute([$param1, $param2])) {
   while ($row = $stmt->fetch()) {
   $data[$row['id']] = $row;
 }
}

Посмотреть, что получилось:
function debug($arr){
    echo '<pre>' . print_r($arr, 1) . '</pre>';
};
debug($data);
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы