因此,我正在创建一个送餐系统。我想检查一下是否花费时间。问题是存在与某些时间相关的持续时间。如果没有持续时间,这样做很容易。
工作代码示例:
例如,这是我的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!';
}
如何考虑持续时间?
答案 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);
如果您在这里只使用两个datetime
而不是将其分为三列,则可以使生活更轻松。然后您也可以从索引中受益。