2015-01-14 3 views
1

У меня есть встроенный запрос, который я использую для вывода данных за предыдущий месяц. Все работает нормально до этого месяца (январь). Мой код выглядит следующим образом:Как извлечь данные за предыдущий месяц за январь

(MONTH(CURRENT DATE)-1) = MONTH(TSTAMP) 

Я его установка так, потому что у меня есть метка время в моих данных, что я базировать запрос прочь. Это обычно работает как шарм, но в этом месяце он не работает, и я думаю, что это из-за нового года. Как эта функция работает при работе с другим годом? Есть ли способ записать его в запрос, поэтому мне не нужно беспокоиться об изменении года?

ответ

0

Вы можете сделать это, используя год, как это:

YEAR(CURRENT DATE) * 12 + MONTH(CURRENT DATE) - 1 = YEAR(TSTAMP) * 12 + MONTH(TSTAMP) 

Это, в сущности, преобразует даты в месяцы с момента времени 0 - поэтому -1 имеет смысл.

+0

Работал как абсолютный шарм! Я ценю ваше время и усилия. Я буду принимать это как ответ примерно через 9 минут, когда это позволит мне. –

+0

... будет, конечно, игнорировать индексы. –

0

Правильный способ сделать это с запросом диапазона (один тоже 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) 

(есть несколько различных форм, но этот выглядит довольно просто)

Смежные вопросы