Проверка, совпадает ли время с продолжительностью - PullRequest
0 голосов
/ 18 апреля 2019

Итак, я создаю систему доставки еды.Я хочу проверить, если время заняло.Проблема в том, что есть продолжительность, связанная с некоторыми временами.Это довольно легко сделать, если нет продолжительности.

ПРИМЕР РАБОЧЕГО КОДА:

Например, вот моя таблица deliveries:

+----+---------------+---------------+----------+
| id | delivery_date | delivery_time | duration |
+----+---------------+---------------+----------+
| 1  | 2018-02-18    | 10:30:00      | null     |
+----+---------------+---------------+----------+

Скажем, выбранное мной время доставки - 2018-02-18 10:30:00, тогда оно будет принято.Код:

$deliveryDate = '2018-02-18';
$deliveryTime = '10:30:00';

$stmt = "SELECT id FROM deliveries WHERE appointment_date = :date AND appointment_time = :time";
$stmt->bindParam(':date', $deliveryDate);
$stmt->bindParam(':time', $deliveryTime);
$stmt->execute();
$result = $stmt->fetch();

if($result) {
    echo 'Sorry, this is already taken!';
}

Этот код работает.


ПРИМЕР НЕ РАБОЧЕГО КОДА:

Я пытаюсь найтиЕсли я изменим duration с null на 40 (40 минут), потребуется заблокировать 2018-02-18 10:30:00 to 11:10:00.

Допустим, продолжительность составляет 40 (минут), а delivery_time составляет 11:05:00.Это должно его заблокировать.

+----+---------------+---------------+----------+
| id | delivery_date | delivery_time | duration |
+----+---------------+---------------+----------+
| 1  | 2018-02-18    | 10:30:00      | 40       |
+----+---------------+---------------+----------+

$deliveryDate = '2018-02-18';
$deliveryTime = '11:05:00';

$stmt = "SELECT id FROM deliveries WHERE appointment_date = :date AND appointment_time = :time";
$stmt->bindParam(':date', $deliveryDate);
$stmt->bindParam(':time', $deliveryTime);
$stmt->execute();
$result = $stmt->fetch();

if($result) {
    echo 'Sorry, this is already taken!';
}

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

1 Ответ

1 голос
/ 18 апреля 2019

Если вы объедините столбец даты и времени с datetime, вы можете использовать timestampadd(), чтобы добавить продолжительность, а затем проверить, находятся ли данные дата и время в периоде.

SELECT id
       FROM deliveries
       WHERE cast(concat(delivery_date, ' ', delivery_time) AS datetime) <= cast(concat(:date, ' ', :time) AS datetime)
             AND timestampadd(minute, duration, cast(concat(delivery_date, ' ', delivery_time) AS datetime)) > cast(concat(:date, ' ', :time) AS datetime);

db <> fiddle

Вы могли бы упростить свою жизнь, если бы просто использовали два datetime здесь вместо того, чтобы разбивать ее на три столбца.Тогда вы могли бы также извлечь выгоду из индексов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...