MySQL возвращаемое значение в зависимости от диапазона дат - PullRequest
1 голос
/ 07 апреля 2020

Я не понимаю, почему мой SQL запрос не работает. Я пытаюсь сделать это:

if date is null then return 0
if date < 15 min then return 1
if date > 15 min and < 30 min then return 2
if date > 30 min and < 60 min then return 3
if date > 60 min and < 180 min then return 4
if date > 180 min then return 5

Итак, вот мой SQL запрос:

SELECT CASE
    WHEN start_date IS NULL THEN 0
    WHEN start_date < DATE_SUB(NOW(),INTERVAL 15 MINUTE) THEN 1
    WHEN start_date BETWEEN DATE_SUB(NOW(), INTERVAL 15 MINUTE) AND DATE_SUB(NOW(), INTERVAL 30 MINUTE) THEN 2
    WHEN start_date BETWEEN DATE_SUB(NOW(), INTERVAL 30 MINUTE) AND DATE_SUB(NOW(), INTERVAL 60 MINUTE) THEN 3
    WHEN start_date BETWEEN DATE_SUB(NOW(), INTERVAL 60 MINUTE) AND DATE_SUB(NOW(), INTERVAL 180 MINUTE) THEN 4
    ELSE 5
END as remaining_time
FROM table

Но я не понимаю, почему, когда я получил только случаи 0, 1 и 5. Остальное время никогда не находится в. случаи 2, 3, 4.

Знаете ли вы, почему?

1 Ответ

1 голос
/ 07 апреля 2020

Такое условие никогда не будет выполнено, потому что нижняя граница больше, чем верхняя граница:

start_date BETWEEN DATE_SUB(NOW(), INTERVAL 15 MINUTE) AND DATE_SUB(NOW(), INTERVAL 30 MINUTE)

У вас должны быть границы наоборот:

SELECT CASE
    WHEN start_date IS NULL THEN 0
    WHEN start_date < DATE_SUB(NOW(),INTERVAL 15 MINUTE) THEN 1
    WHEN start_date BETWEEN DATE_SUB(NOW(), INTERVAL 30 MINUTE) AND DATE_SUB(NOW(), INTERVAL 15 MINUTE) THEN 2
    WHEN start_date BETWEEN DATE_SUB(NOW(), INTERVAL 60 MINUTE) AND DATE_SUB(NOW(), INTERVAL 30 MINUTE) THEN 3
    WHEN start_date BETWEEN DATE_SUB(NOW(), INTERVAL 180 MINUTE) AND DATE_SUB(NOW(), INTERVAL 60 MINUTE) THEN 4
    ELSE 5
END as remaining_time
FROM table

CASE останавливается на первом условии соответствия, поэтому это можно упростить следующим образом:

SELECT CASE
    WHEN start_date is NULL THEN 0
    WHEN start_date < NOW() - INTERVAL 15  MINUTE THEN 1
    WHEN start_date < NOW() - INTERVAL 30  MINUTE THEN 2
    WHEN start_date < NOW() - INTERVAL 60  MINUTE THEN 3
    WHEN start_date < NOW() - INTERVAL 180 MINUTE THEN 4
    ELSE 5
END as remaining_time
FROM table
...