Ищем запрос mysql для подсчета всех строк, предшествующих предыдущему месяцу

0

Я пропущу "почему" для краткости. Но если вы хотите знать, вы можете спросить. Но в основном мой первый квест заключался в том, чтобы найти способ подсчета всех строк, предшествующих текущему месяцу. Я нашел решение этого, которое работает:

SELECT COUNT(*) FROM myTable 
WHERE log_date < (CURDATE() -  DAYOFMONTH(CURDATE()))

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

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

SELECT COUNT(*) FROM myTable 
WHERE log_date < ((CURDATE()- DAYOFMONTH(CURDATE())) - INTERVAL 1 MONTH)

и

SELECT COUNT(*) FROM myTable 
WHERE log_date < DATE_SUB((CURDATE()- DAYOFMONTH(CURDATE())), INTERVAL 1 MONTH)

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

Есть ли способ получить ответ, который я ищу в одном запросе?

Спасибо.

Теги:
date

3 ответа

0

Я нашел решение. Спасибо, goreSplatter и ajreal и dcestari за вас, и помогли мне продумать это. Вот рабочий запрос:

$query = mysql_query("SELECT SUM(IF(log_date<(CURDATE()-DAYOFMONTH(CURDATE())),1,0)) AS LAST_MONTH, SUM(IF(log_date<DATE_ADD(LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 2 MONTH)), INTERVAL 1 DAY),1,0)) AS PREV_MONTH FROM myTable WHERE member_id = '$mid'")or die(mysql_error());

Для расчета PREV_MONTH я вернулся два месяца, получил последний день этого месяца и добавил один день, чтобы получить первый день последнего месяца. Похоже, если у них есть "LAST_DAY", у них также будет функция "FIRST_DAY".

Надеюсь, это поможет кому-то помочь.

0

Хорошо, я думаю, что получаю то, что вы хотите.

У вас есть 2 даты и требуется COUNT для записей перед каждой датой.

SELECT
SUM(IF(log_date<DATESUB(CURDATE()-DAYOFMONTH(CURDATE())), 1, 0)) AS LAST_MONTH,
SUM(IF(log_date<DATE_SUB((CURDATE()-DAYOFMONTH(CURDATE())),INTERVAL 1 MONTH),1,0) 
AS PREV_MONTH
FROM ....
WHERE log_date < DATESUB(CURDATE() - DAYOFMONTH(CURDATE()));

Таким образом, у вас есть 2 эмулированных COUNT с помощью SUM в сочетании с IF.

Я предполагаю, что вы используете MySQL, но это может работать на других СУБД

Надеюсь, это поможет!

  • 0
    Мне это нравится и очень хотелось, чтобы это сработало. Я получаю синтаксическую ошибку в этой первой части «SUM (ЕСЛИ ... LAST_MONTH»), когда я вычеркиваю это, он подсчитывает вторую. Но ответ, который он дает, равен «0», как и в запросах, которые я построил. Возможно ли, что он только подсчитывает строки за один предыдущий месяц, потому что ответом будет «0». Но мне нужно, чтобы он подсчитал все предыдущие месяцы.
  • 0
    Я исправил первую строку. Он не нуждался в DATE_SUB для этой суммы, потому что не было факторов для вычитания. Результат для LAST_MONTH правильный (36), но PREV_MONTH должен вернуть 14 и вернуть 0.
Показать ещё 1 комментарий
0

Попробуйте следующее:

SELECT COUNT(*) FROM `myTable` WHERE `log_date` BETWEEN "2010-11-01 00:00:00" AND "2010-11-30 23:59:59"
  • 0
    Это интересный подход. Это дало мне идею. Поскольку до определенной даты нет записей, я мог бы использовать в качестве даты начала что-то вроде «2010-01-01», а затем мне просто нужно было бы манипулировать датой окончания. Но так как это будет использоваться в цикле, мне нужно иметь возможность манипулировать датой окончания с помощью переменной. Вот почему использование варианта «ИНТЕРВАЛ 1 МЕСЯЦ» было бы очень полезно. Я мог бы изменить этот интервал на что угодно.
Сообщество Overcoder
Наверх
Меню