Из timestamp в SQL, выбрав записи с сегодняшнего дня, вчера, на этой неделе, в этом месяце и между двумя датами php mysql - программирование
Подтвердить что ты не робот

Из timestamp в SQL, выбрав записи с сегодняшнего дня, вчера, на этой неделе, в этом месяце и между двумя датами php mysql

Надеюсь, это простое решение, но я пытаюсь отфильтровать данные для следующего: -

  • Сегодня
  • Вчера
  • На этой неделе
  • В этом месяце
  • Между двумя датами.

Дата, которую я получаю из базы данных, - это в основном временная метка.

Это то, что я пробовал: -

  • Сегодня

    SELECT n.title, COUNT(*) AS times FROM node_view_count WHERE timestamp > DATE_SUB(NOW(), INTERVAL 1 DAY)
    
  • Вчера

    SELECT n.title, COUNT(*) AS times FROM node_view_count WHERE timestamp > DATE_SUB(NOW(), INTERVAL 7 DAYS)
    

...

Это не работает.

Любая идея?

4b9b3361

Ответ 1

Если вы выбираете только по дате, основывайте свои вычисления на CURDATE (который возвращает только дату), а не NOW (который возвращает дату и время). Эти примеры будут захватывать все время в дневных диапазонах:

  • Сегодня: WHERE timestamp >= CURDATE()
  • Вчера: WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND timestamp < CURDATE()
  • В этом месяце: WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)
  • Между двумя датами 3 июня 2013 года и 7 июня 2013 года (обратите внимание, как дата окончания указана как 8 июня, а не 7 июня): WHERE timestamp >= '2013-06-03' AND timestamp < '2013-06-08'

"На этой неделе" зависит от того, в какой день вы начнете свою неделю; Я оставлю это вам. Вы можете использовать функцию DAYOFWEEK, чтобы настроить CURDATE() на соответствующие диапазоны.


Addendum: тип столбца OP был INTEGER, сохраняя отметку времени UNIX, и мой ответ предполагал, что тип столбца был TIMESTAMP. Здесь, как делать все те же вещи со значением отметки времени UNIX и по-прежнему поддерживать оптимизацию, если индексируется столбец (так как ответы будут выше, если индексируется столбец TIMESTAMP)...

В принципе, решение состоит в том, чтобы просто завернуть даты начала и/или окончания в функции UNIX_TIMESTAMP:

  • Сегодня: WHERE timestamp >= UNIX_TIMESTAMP(CURDATE())
  • Вчера: WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) AND timestamp < UNIX_TIMESTAMP(CURDATE())
  • В этом месяце: WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY))
  • Между двумя датами 3 июня 2013 года и 7 июня 2013 года (обратите внимание, как дата окончания указана как 8 июня, а не 7 июня): WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')