Подсчет всех строк в столбце с двумя разными условиями даты - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь превратить два запроса подсчета с условиями даты (приведенными ниже) в один запрос.

SELECT COUNT(*) as yesterday FROM orders WHERE DATE(timedate) = DATE(NOW() - INTERVAL 1 DAY)
SELECT COUNT(*) as yesterday FROM orders WHERE DATE(timedate) = DATE(NOW() - INTERVAL 2 DAY)

Следуя совету другого ответа Я создал следующее, но, похоже, это не работает по синтаксису, и я не совсем уверен, почему. Есть ли другой способ сделать это? Я не могу найти похожий вопрос по этому вопросу

SELECT 
    SUM(IF(DATE(timedate) = DATE(NOW() - INTERVAL 1 DAY))) AS testcount1,
    SUM(IF(DATE(timedate) = DATE(NOW() - INTERVAL 2 DAY))) AS testcount2
FROM 
    orders

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Вам не хватает выходных значений для выражения IF. Также вам следует использовать CURRENT_DATE(), поэтому вам не нужно преобразовывать в DATE:

SELECT 
    SUM(IF(DATE(timedate) = CURRENT_DATE() - INTERVAL 1 DAY, 1, 0)) AS testcount1,
    SUM(IF(DATE(timedate) = CURRENT_DATE() - INTERVAL 2 DAY, 1, 0)) AS testcount2
FROM 
    orders

Обратите внимание, что MySQL обрабатывает логические выражения как 1 (true) или 0 (false) в числовом c контексте, так что вы можете SUM выражение без необходимости IF:

SELECT 
    SUM(DATE(timedate) = CURRENT_DATE() - INTERVAL 1 DAY) AS testcount1,
    SUM(DATE(timedate) = CURRENT_DATE() - INTERVAL 2 DAY) AS testcount2
FROM 
    orders
1 голос
/ 30 марта 2020

Вы хотите условную агрегацию. Я бы сформулировал запрос следующим образом:

SELECT 
    SUM(
        timedate >= CURRENT_DATE - INTERVAL 1 DAY
        and timedate < CURRENT_DATE
    ) AS testcount1,
    SUM(
        timedate >= CURRENT_DATE - INTERVAL 2 DAY
        and timedate < CURRENT_DATE- INTERVAL 1 DAT
    ) AS testcount2
FROM orders

Подробности:

  • , здесь используется приятная функция MySQL, которая оценивает ложные / истинные условия как 0/1 в цифре c контекст

  • функции даты не применяются к столбцу timedate: вместо этого мы проводим сравнение дат в буквальном смысле. Это гораздо эффективнее, поскольку база данных может использовать индекс столбца datetime

Возможно, вы также захотите добавить в запрос предложение WHERE:

WHERE 
    timedate >= CURRENT_DATE - INTERVAL 2 day
    AND timedate< CURRENT_DATE
...