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

Я думаю, это довольно просто, но не может понять. Я пытаюсь сделать несколько страниц - тот, который будет содержать результаты, выбранные из моей таблицы mysql db на сегодня, на этой неделе и в этом месяце. Даты вводятся, когда запись создается с помощью date('Y-m-d H:i:s');. Вот что я до сих пор:

день, где датa > (дата- (60 * 60 * 24))

 "SELECT * FROM jokes WHERE date>(date-(60*60*24)) ORDER BY score DESC"

неделя, где датa > (дата- (60 * 60 * 24 * 7))

 "SELECT * FROM jokes WHERE date>(date-(60*60*24*7)) ORDER BY score DESC"

месяц (30 дней), где датa > (дата- (60 * 60 * 24 * 30))

 "SELECT * FROM jokes WHERE date>(date-(60*60*24*30)) ORDER BY score DESC"

Любые идеи будут высоко оценены. Спасибо!

Ответ 1

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

Ответ 2

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

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

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

На прошлой неделе:

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

Я думаю, что использование функции 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();
}

Ответ 10

Чтобы получить данные за прошлую неделю в 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());

Ответ 11

Вы можете сделать то же самое, используя один запрос

SELECT sum(if(DATE(dDate)=DATE(CURRENT_TIMESTAMP),earning,null)) astodays,
       sum(if(YEARWEEK(dDate)=YEARWEEK(CURRENT_DATE),earning,null)) as weeks, 
       IF((MONTH(dDate) = MONTH(CURRENT_TIMESTAMP()) AND YEAR(dDate) = YEAR(CURRENT_TIMESTAMP())),sum(earning),0) AS months,
       IF(YEAR(dDate) = YEAR(CURRENT_TIMESTAMP()),sum(earning),0) AS years, 
       sum(fAdminFinalEarning) as total_earning FROM 'earning'

Надеюсь, это работает.