检查时间是否等于持续时间

时间:2019-04-18 19:23:11

标签: php mysql mysqli time pdo

因此,我正在创建一个送餐系统。我想检查一下是否花费时间。问题是存在与某些时间相关的持续时间。如果没有持续时间,这样做很容易。

工作代码示例:

例如,这是我的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!';
}

该代码有效。


不工作代码示例:

我正在尝试确定是否将durationnull更改为40(40分钟),这将需要屏蔽2018-02-18 10:30:00 to 11:10:00

假设持续时间为40(分钟),而delivery_time11: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 个答案:

答案 0 :(得分:1)

如果将日期和时间列合并到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而不是将其分为三列,则可以使生活更轻松。然后您也可以从索引中受益。