这个问题在这里已有答案:
我需要找出如何COUNT
匹配我的查询的行数。这是我的数据库:
+----+---------------+---------------+----------+
| id | delivery_date | delivery_time | duration |
+----+---------------+---------------+----------+
| 1 | 2018-02-17 | 10:30:00 | 40 |
+----+---------------+---------------+----------+
| 2 | 2018-02-18 | 14:20:00 | 25 |
+----+---------------+---------------+----------+
| 3 | 2018-02-19 | 08:50:00 | null |
+----+---------------+---------------+----------+
我有一个selectedDate
和一个selectedTime
。我想知道它是否落在“持续时间”期间,之前和之后。
因此,例如,如果delivery_time
是10:30:00
而duration
是40,那么它将减去40并将delivery_time
加40。因此,任何时候落在09:50:00
- 11:10:00
之间将被视为存在。
此外,如果持续时间不存在或为空,则只计算delivery_time
本身。
这是我的代码(只是一个例子,不是生产安全,包括漏洞):
/////// Expected Output //////
$selectedDate1 = '2018-02-18';
$selectedTime1 = '14:35:00';
// Exists
$selectedDate2 = '2018-02-18';
$selectedTime2 = '14:50:00';
// Does not exist
$selectedDate3 = '2018-02-17';
$selectedTime3 = '09:50:00';
// Exists
$selectedDate3 = '2018-02-19';
$selectedTime3 = '08:50:00';
// Exists
////// Expected Output End //////
$stmt = $dbh->prepare("
SELECT COUNT(*) FROM deliveries
WHERE delivery_date = $selectedDate# AND
(delivery_time = $selectedTime# AND duration IS NULL)
OR
(delivery_time +-= duration = $selectedTime# AND duration IS NOT NULL)
);
显然,delivery_time +-= duration
需要修复/修改。任何帮助,将不胜感激!
此查询将为您提供所需的结果。它检查交货日期是否与所选日期相匹配,然后检查交货时间是否与选择时间相同(无需检查duration IS NULL
是否为duration IS NOT NULL
时的有效条件),或者是否选定的时间属于交付窗口(delivery_time +/- duration)。
SELECT COUNT(*)
FROM deliveries
WHERE delivery_date = @selectedDate
AND (delivery_time = @selectedTime OR
@selectedTime BETWEEN delivery_time - INTERVAL duration MINUTE
AND delivery_time + INTERVAL duration MINUTE);