Выберите записи с сегодняшнего дня, на этой неделе, в этом месяце php mysql
Я думаю, что это довольно просто, но не могу понять. Я пытаюсь сделать несколько страниц-одну, которая будет содержать результаты, выбранные из таблицы моей базы данных mysql на сегодня, на этой неделе и в этом месяце. Даты вводятся при создании записи с помощью date('Y-m-d H:i:s');
. Вот что у меня есть до сих пор:
день где дата>(дата-(60*60*24))
"SELECT * FROM jokes WHERE date>(date-(60*60*24)) ORDER BY score DESC"
неделю где дата>(дата-(60*60*24*7))
"SELECT * FROM jokes WHERE date>(date-(60*60*24*7)) ORDER BY score DESC"
месяц (30 дней), где дата>(дата-(60*60*24*30))
"SELECT * FROM jokes WHERE date>(date-(60*60*24*30)) ORDER BY score DESC"
любые идеи будут высоко ценится. Спасибо!
10 ответов:
предполагая, что ваш столбец даты является фактическим столбцом даты MySQL:
SELECT * FROM jokes WHERE date > DATE_SUB(NOW(), INTERVAL 1 DAY) ORDER BY score DESC; SELECT * FROM jokes WHERE date > DATE_SUB(NOW(), INTERVAL 1 WEEK) ORDER BY score DESC; SELECT * FROM jokes WHERE date > DATE_SUB(NOW(), INTERVAL 1 MONTH) ORDER BY score DESC;
попробуйте использовать функции даты и времени (месяц (), год (), День (), MySQL Manual)
на этой неделе:
SELECT * FROM jokes WHERE WEEKOFYEAR(date)=WEEKOFYEAR(NOW());
на прошлой неделе:
SELECT * FROM jokes WHERE WEEKOFYEAR(date)=WEEKOFYEAR(NOW())-1;
текущий месяц:
SELECT * FROM jokes WHERE YEAR(date) = YEAR(NOW()) AND MONTH(date)=MONTH(NOW());
на текущей неделе:
SELECT * FROM jokes WHERE WEEKOFYEAR(date) = WEEKOFYEAR(NOW());
текущий день:
SELECT * FROM jokes WHERE YEAR(date) = YEAR(NOW()) AND MONTH(date) = MONTH(NOW()) AND DAY(date) = DAY(NOW());
Это будет выбрать только текущий месяц, действительно неделю и действительно только сегодня : -)
ответ Натана даст вам шутки из последних 24, 168 и 744 часов, а не шутки с сегодняшнего дня, на этой неделе, в этом месяце. Если это то, что вы хотите, отлично, но я думаю, что вы можете искать что-то другое.
используя его код, в полдень вы получите шутки, начинающиеся вчера в полдень и заканчивающиеся сегодня в полдень. Если вы действительно хотите сегодняшних шуток, попробуйте следующее:
SELECT * FROM jokes WHERE date >= CURRENT_DATE() ORDER BY score DESC;
вы бы сделать что-то немного отличается от текущей недели, месяц, так далее. но вы поняли идею.
все, кажется, ссылаются на дату, являющуюся столбцом в таблице.
Я не думаю, что это хорошая практика. Слово date может быть просто ключевым словом на каком-то языке кодирования (возможно, Oracle), поэтому, пожалуйста, измените дату columnname на возможно JDate.
Так будет лучше работать следующее:SELECT * FROM jokes WHERE JDate >= CURRENT_DATE() ORDER BY JScore DESC;
Итак, у нас есть таблица под названием шутки со столбцами JScore и JDate.
ответ Натана очень близок, однако он вернет плавающий результирующий набор. По мере сдвига времени записи будут всплывать из и на результирующий набор. Используя
DATE()
функция onNOW()
лишит элемент времени от даты создания статического результирующего набора. Так какdate()
функция применяется кnow()
вместо фактическогоdate
производительность столбца должна быть выше с момента применения такой функции, какdate()
к столбцу даты блокирует способность MySql использовать индекс.для сохранения статического набора результатов используйте:
SELECT * FROM jokes WHERE date > DATE_SUB(DATE(NOW()), INTERVAL 1 DAY) ORDER BY score DESC; SELECT * FROM jokes WHERE date > DATE_SUB(DATE(NOW()), INTERVAL 1 WEEK) ORDER BY score DESC; SELECT * FROM jokes WHERE date > DATE_SUB(DATE(NOW()), INTERVAL 1 MONTH) ORDER BY score DESC;
Ну, это решение поможет вам выбрать только текущий месяц, текущую неделю и только сегодня
SELECT * FROM games WHERE games.published_gm = 1 AND YEAR(addedon_gm) = YEAR(NOW()) AND MONTH(addedon_gm) = MONTH(NOW()) AND DAY(addedon_gm) = DAY(NOW()) ORDER BY addedon_gm DESC;
для еженедельных добавленных сообщений:
WEEKOFYEAR(addedon_gm) = WEEKOFYEAR(NOW())
для ежемесячных добавленных сообщений:
MONTH(addedon_gm) = MONTH(NOW())
для ежегодных добавленных сообщений:
YEAR(addedon_gm) = YEAR(NOW())
вы получите точные результаты, где показывают только игры, добавленные сегодня, в противном случае вы можете отобразить: "нет новых игр, найденных на сегодня". Использование набора записей ShowIF-это пустая транзакция.
Я думаю, что с помощью
NOW()
функция неверна для получения разницы во времени. Потому чтоNOW()
функция каждый раз, когда вы вычисляете последние 24 часа. Вы должны использовать .function your_function($time, $your_date) { if ($time == 'today') { $timeSQL = ' Date($your_date)= CURDATE()'; } if ($time == 'week') { $timeSQL = ' YEARWEEK($your_date)= YEARWEEK(CURDATE())'; } if ($time == 'month') { $timeSQL = ' Year($your_date)=Year(CURDATE()) AND Month(`your_date`)= Month(CURDATE())'; } $Sql = "SELECT * FROM jokes WHERE ".$timeSQL return $Result = $this->db->query($Sql)->result_array(); }
чтобы получить данные за прошлую неделю в MySQL. Это работает для меня даже через год границы.
select * from orders_order where YEARWEEK(my_date_field)= YEARWEEK(DATE_SUB(CURRENT_DATE(), INTERVAL 1 WEEK));
получить данные текущей недели
select * from orders_order where YEARWEEK(date_sold)= YEARWEEK(CURRENT_DATE());