Выберите записи за сегодня, на этой неделе, в этом месяце php mysql - PullRequest
65 голосов
/ 14 марта 2011

Я думаю, это довольно просто, но не могу понять. Я пытаюсь создать несколько страниц, одна из которых будет содержать результаты, выбранные из таблицы моей базы данных 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 ]

118 голосов
/ 14 марта 2011

Предполагая, что ваш столбец даты является фактическим столбцом даты 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;
70 голосов
/ 25 августа 2011

Попробуйте использовать функции даты и времени (MONTH (), YEAR (), DAY (), MySQL Manual )

На этой неделе:

SELECT * FROM jokes WHERE WEEKOFYEAR(date)=WEEKOFYEAR(NOW());

Lastнеделя:

SELECT * FROM jokes WHERE WEEKOFYEAR(date)=WEEKOFYEAR(NOW())-1;
37 голосов
/ 16 октября 2014

Текущий месяц:

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());

Выбирается только текущий месяц, действительно неделя и действительнотолько сегодня: -)

9 голосов
/ 28 мая 2011

Ответ Натана даст вам анекдоты за последние 24, 168 и 744 часов, а НЕ анекдоты с сегодняшнего дня, на этой неделе, в этом месяце.Если это то, что вы хотите, отлично, но я думаю, что вы, возможно, ищете что-то другое.

Используя его код, в полдень, вы получите шутки, начинающиеся вчера в полдень и заканчивающиеся сегодня в полдень.Если вы действительно хотите сегодняшние шутки, попробуйте следующее:

SELECT * FROM jokes WHERE date >= CURRENT_DATE() ORDER BY score DESC;  

Вы должны будете сделать что-то немного отличающееся от текущей недели, месяца и т. Д., Но вы поймете идею.

4 голосов
/ 04 февраля 2013

Кажется, что все ссылаются на дату как на столбец в таблице.
Я не думаю, что это хорошая практика.Слово date может быть просто ключевым словом в некотором языке кодирования (может быть, Oracle), поэтому, пожалуйста, измените дату столбца на, возможно, JDate.
Так что следующее будет работать лучше:

SELECT * FROM jokes WHERE JDate >= CURRENT_DATE() ORDER BY JScore DESC;

Итак, у нас есть таблицаназывается шутками с колонками JScore и JDate.

3 голосов
/ 02 мая 2016

Лучшее решение для "сегодня":

SELECT * FROM jokes WHERE DATE(date) = DATE(NOW())
2 голосов
/ 26 июля 2013

Ответ Натана очень близок, однако он вернет плавающий набор результатов. По мере того, как время сдвигается, записи всплывают и попадают в набор результатов. Использование функции DATE() на NOW() удалит элемент времени с даты, создавая статический набор результатов. Поскольку функция 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;
0 голосов
/ 02 января 2018

Чтобы получить данные за прошлую неделю в 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());
0 голосов
/ 16 октября 2017

Я думаю, что использование функции NOW() неверно для получения разницы во времени.Потому что по NOW() функция каждый раз, когда вы рассчитываете за последние 24 часа.Вы должны использовать CURDATE() вместо этого.

    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();
}
0 голосов
/ 08 декабря 2015

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

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 - пустая транзакция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...