Правильный способ сделать это с запросом диапазона (один тоже with an exclusive upper-bound, <
), так что db является бесплатным для нас индексом, если он доступен.
Первый из месяца может быть получен довольно легко с помощью:
CURRENT_DATE - (DAY(CURRENT_DATE) - 1) DAYS
(Вычесть разницу в дни между текущей датой и началом месяца)
Это дает прекрасное верхний переплет условие по запросу:
WHERE tStamp < CURRENT_DATE - (DAY(CURRENT_DATE) - 1) DAYS
(Получить все до начала текущего месяца).
Однако, поскольку нас действительно интересует только предыдущий месяц, нам также необходимо ограничить нижнюю границу. Ну, это все так, или, начало этого месяца ... и так как мы уже можем получить начало тока месяц:
WHERE tStamp >= CURRENT_DATE - (DAY(CURRENT_DATE) - 1) DAYS + 1 MONTH
AND tStamp < CURRENT_DATE - (DAY(CURRENT_DATE) - 1) DAYS
Там в родственный способ сделать это, предположив, что вы иметь таблицу календаря с соответствующими индексами. Если у вас есть минимальная таблица с этими столбцами:
calendarDate - DATE
year - INTEGER
month - INTEGER
dayOfMonth - INTEGER
... Вы можете использовать эту таблицу, чтобы получить соответствующие значения вместо:
WHERE tStamp >= (SELECT calendarDate
FROM calendarTable
WHERE year = YEAR(CURRENT_DATE - 1 MONTH)
AND month = MONTH(CURRENT_DATE - 1 MONTH)
AND dayOfMonth = 1)
AND tStamp < (SELECT calendarDate
FROM calendarTable
WHERE year = YEAR(CURRENT_DATE)
AND month = MONTH(CURRENT_DATE)
AND dayOfMonth = 1)
(есть несколько различных форм, но этот выглядит довольно просто)
Работал как абсолютный шарм! Я ценю ваше время и усилия. Я буду принимать это как ответ примерно через 9 минут, когда это позволит мне. –
... будет, конечно, игнорировать индексы. –