#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 thenSET @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 МЕСЯЦ))