2013-08-06 3 views
1

Я пытаюсь получить набор результатов из моей базы данных MySQL, в котором перечислены все учетные записи, у которых была дата начала, которая находится в любой четверти назад (так что либо 3, 6, 9, 12 и т. Д. несколько месяцев назад). Следующий запрос работает в течение одного квартала:Выберите DATE, которая находится где-то 3 месяца назад

SELECT `id`, `name`, `date_start` FROM `accounts` 
WHERE `account_status_id`=2 
AND DATE_FORMAT(`date_start`, '%m%d') = DATE_FORMAT(
    DATE_SUB(NOW(), INTERVAL 1 QUARTER), '%m%d' 
); 

В нем перечислены все, что началось ровно 3 месяца назад, что хорошо. Но мне также хотелось бы, чтобы любое умножение 3 месяца назад (так 6, 9 и т. Д.) Также было выбрано. Как мне это сделать?

+0

Есть ли предел кратных или 9,12,15 ..... так далее? –

+0

@dianuj Не желательно, я мог бы, конечно, добавить предложение «OR» и добавить все возможные месяцы, на которые он может вернуться, но я бы предпочел решение, которое определяет период «на лету», поэтому конечный пользователь не ограниченный годом или чем-то. – Oldskool

ответ

2

Вам необходимо использовать оператор modulo.

Это как раз у меня на голове, так что это может быть не совсем правильно, но этого должно быть достаточно, чтобы вы попали на правильный путь. Оператор mod будет возвращать 0 в этом случае для любого кратного трех месяцев назад.

На второй мысли, вы, вероятно, следует использовать MONTH() и DAY() вместо DATE_FORMAT

SELECT `id`, `name`, `date_start` FROM `accounts` 
WHERE `account_status_id`=2 
AND DAY(`date_start`) = DAY(NOW()) 
AND (((MONTH(NOW()) - MONTH(`date_start`)) mod 3) = 0); 
2
SELECT `id`, `name`, `date_start` 
FROM `accounts` 
WHERE `account_status_id`=2 
and dayofmonth(date_start) = dayofmonth(curdate()) 
and month(date_start) % 3 = month(CURDATE()) % 3 
0

Попробуйте это,

SELECT `id`, `name`, `date_start` FROM `accounts` 
    WHERE MONTH(`date_start`)- MONTH(NOW()) IN (-3,-6,-9,0,3,6,9) 

если вы хотите также проверить точный день, то добавьте

AND DAY(`date_start`) = DAY(NOW()) 

DEMO HERE

это может быть проще, но идея в этом.

1

Учтите, что «ровно три месяца назад» может быть немного, неуточненным. Если это 31 мая, что такое «Три месяца назад»? 31 февраля ???? 3 марта ????? ;)

Итак, возможно, лучше использовать «90 дней назад» или «12 недель назад», которые будут использовать аналогичные методы мод. Оба они имеют очень точные определения. В течение месяца вам удастся ударить головой о стол. Однако это может быть спецификация, и у вас нет выбора. В этом случае обязательно проверяйте различные случаи конца месяца.

+0

Хороший совет, я обязательно приму некоторые тесты для этих сценариев. – Oldskool

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