Выберите записи с сегодняшнего дня, на этой неделе, в этом месяце php mysql

Я думаю, что это довольно просто, но не могу понять. Я пытаюсь сделать несколько страниц, которые будут содержать результаты, выбранные из таблицы моей MySQL db на сегодня, на этой неделе и в этом месяце. Даты вводятся, когда запись создается с помощью 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 дней), где date>(дата-(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)

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

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;

Итак, у нас есть таблица под названием Jokes со столбцами JScore и JDate.


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

SELECT * FROM jokes WHERE DATE(date) = DATE(NOW())

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

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

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