MySQL выбирает все строки с прошлого месяца до (now() — 1 месяц) для сравнительных целей

#mysql #datetime

#mysql #datetime

Вопрос:

Мне нужна помощь в написании запроса MySQL, который покажет мне строки за прошлый месяц, но не за весь месяц, только до того же дня, часа и минуты, что и сейчас (), но за 1 месяц до этого.

Так, например, если сегодня 5/19 в 17: 25 вечера, мне нужно выбрать строки с 12: 00 полуночи 4/1 до 17: 25 вечера 4/19 (конечно, того же года).

Спасибо!

Ответ №1:

Вы можете получить первое число месяца, вычислив last_day предыдущего месяца и добавив один день. Это неудобно, но я думаю, что это лучше, чем форматировать дату как строку и использовать ее для вычисления.

 select 
  *
from
  yourtable t
where
  /* Greater or equal to the start of last month */
  t.date >= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY) and
  /* Smaller or equal than one month ago */
  t.date <= DATE_SUB(NOW(), INTERVAL 1 MONTH)
  

Комментарии:

1. 1 Хороший способ получить первый день последнего месяца без преобразования строк

2. 1 очень приятно…. Я использовал SET @FirstDayLastMonth = (DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY)); and then SET @LastDayLastMonth = (LAST_Day(@FirstDayLastMonth)); для того, чтобы мне нужно было получить первый и последний день предыдущего месяца. Большое вам спасибо, GolezTrol!!!

Ответ №2:

Получить данные месячной давности легко с помощью одной функции MySQL:

 SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH);
  

или

 SELECT NOW() - INTERVAL 1 MONTH;
  

С самого начала я не могу придумать элегантный способ получить первый день прошлого месяца в MySQL, но это, безусловно, сработает:

 SELECT CONCAT(LEFT(NOW() - INTERVAL 1 MONTH,7),'-01');
  

Соедините их вместе, и вы получите запрос, который решает вашу проблему:

 SELECT *
FROM your_table
WHERE t >= CONCAT(LEFT(NOW() - INTERVAL 1 MONTH,7),'-01')
AND t <= NOW() - INTERVAL 1 MONTH
  

Ответ №3:

Простой код, пожалуйста, проверьте

 SELECT * FROM table_name WHERE created >= (NOW() - INTERVAL 1 MONTH)
  

Комментарии:

1. Разве это не должно быть больше, чем равно? SELECT * FROM table_name WHERE created >= (NOW() - INTERVAL 1 MONTH) ?

2. Как возможно получить так много голосов «за», несмотря на то, что это полная противоположность правильному ответу? Кто-нибудь, пожалуйста, разъясните, что за волшебство стоит за этим! (Отредактировал ответ)

Ответ №4:

Это пример операции MySQL с датой, относящейся к вашему вопросу:

 SELECT DATE_ADD( now( ) , INTERVAL -1 MONTH ) 
  

Приведенное выше значение вернет дату и время месячной давности

Итак, вы можете использовать это следующим образом:

 SELECT * 
FROM your_table 
WHERE Your_Date_Column BETWEEN '2011-01-04' 
    AND DATE_ADD(NOW( ), INTERVAL -1 MONTH )
  

Ответ №5:

 SELECT
     * 
FROM 
     <table_name> 
WHERE 
     <date_field> BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW();
  

Аналогично, вы можете выбрать записи за 1 месяц, 2 месяца и т.д.

Ответ №6:

 SELECT * 
FROM table 
WHERE date BETWEEN 
    ADDDATE(LAST_DAY(DATE_SUB(NOW(),INTERVAL 2 MONTH)), INTERVAL 1 DAY) 
    AND DATE_SUB(NOW(),INTERVAL 1 MONTH);
  

Смотрите Документы для получения информации о DATE_SUB , ADDDATE , LAST_DAY и других полезных функциях datetime.

Ответ №7:

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

 WHERE DateColumn BETWEEN
    CAST(date_format(date_sub(NOW(), INTERVAL 1 MONTH),'%Y-%m-01') AS date)
    AND
    date_sub(now(), INTERVAL 1 MONTH)
  

Ответ №8:

 SELECT *
FROM table
WHERE myDtate BETWEEN now()
    , DATE_SUB(NOW()
    , INTERVAL 1 MONTH)
  

Ответ №9:

Мое решение состояло в том, чтобы избегать использования NOW() при написании sql на вашем языке программирования и заменять его строкой. Проблема с NOW() тем, что вы указываете, заключается в том, что оно включает текущее время. Таким образом, для записи с начала дня запроса (0 часов и минут) вместо:

 r.date <= DATE_SUB(NOW(), INTERVAL 99 DAY)
  

Я сделал (php):

 $current_sql_date = date('Y-m-d 00:00:00');
  

в sql:

 $sql_x = "r.date <= DATE_SUB('$current_sql_date', INTERVAL 99 DAY)"
  

При этом вы будете извлекать данные с полуночи данного дня

Комментарии:

1. Вы можете попробовать использовать что-то подобное для текущего дня SELECT DAY(NOW()); и это для вчерашнего SELECT DAY(NOW() - INTERVAL 1 DAY);

Ответ №10:

может быть, так — все ДАТЫ за последний месяц (recDate) МЕЖДУ DATE_ADD(LAST_DAY(DATE_SUB(CURDATE(), ИНТЕРВАЛ 2 МЕСЯЦА)), ИНТЕРВАЛ 1 ДЕНЬ) И LAST_DAY (DATE_SUB(CURDATE(), ИНТЕРВАЛ 1 МЕСЯЦ))