在where子句[duplicate]中选择具有持续时间计算的行

问题描述 投票:0回答:1

这个问题在这里已有答案:

我需要找出如何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_time10:30:00duration是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需要修复/修改。任何帮助,将不胜感激!

mysql where
1个回答
1
投票

此查询将为您提供所需的结果。它检查交货日期是否与所选日期相匹配,然后检查交货时间是否与选择时间相同(无需检查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);

Demo on dbfiddle

© www.soinside.com 2019 - 2024. All rights reserved.