MySQL выбирает все строки с прошлого месяца до (now () - 1 месяц), для сравнительных целей - PullRequest
62 голосов
/ 20 мая 2011

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

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

Спасибо!

Ответы [ 8 ]

118 голосов
/ 20 мая 2011

Вы можете получить первое число месяца, рассчитав 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)
25 голосов
/ 20 мая 2011

Получить месяц назад легко с одной функцией 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
20 голосов
/ 09 июля 2013

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

SELECT * FROM table_name WHERE created <= (NOW() - INTERVAL 1 MONTH)
9 голосов
/ 20 мая 2011

Это пример операции с датой в 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 )
4 голосов
/ 20 мая 2011
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 и других полезных функциях даты и времени.

2 голосов
/ 20 мая 2011

Вы можете использовать предложение 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)
0 голосов
/ 03 апреля 2013

Мое решение состояло в том, чтобы избегать использования 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)"

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

0 голосов
/ 20 мая 2011
SELECT *
FROM table
WHERE myDtate BETWEEN now()
    , DATE_SUB(NOW()
    , INTERVAL 1 MONTH)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...