Как выбрать строки с меткой времени текущего дня?

Я пытаюсь выбрать только сегодняшние записи из таблицы базы данных.

В настоящее время я использую

SELECT * FROM `table` WHERE (`timestamp` > DATE_SUB(now(), INTERVAL 1 DAY));

Но это приводит к результатам за последние 24 часа, и мне нужно только отобрать результаты с сегодняшнего дня, игнорируя время. Как я могу выбрать результаты только на основе даты?

Ответ 1

используйте DATE и CURDATE()

SELECT * FROM `table` WHERE DATE(`timestamp`) = CURDATE()

Я предполагаю, что использование DATE все еще использует INDEX.

см. план выполнения на DEMO

Ответ 2

Если вы хотите, чтобы индекс использовался и запрос не выполнял сканирование таблицы:

WHERE timestamp >= CURDATE()
  AND timestamp < CURDATE() + INTERVAL 1 DAY

Чтобы показать разницу, которую это делает в реальных планах выполнения, мы проверим с помощью SQL-Fiddle (чрезвычайно полезно сайт):

CREATE TABLE test                            --- simple table
    ( id INT NOT NULL AUTO_INCREMENT
    ,`timestamp` datetime                    --- index timestamp
    , data VARCHAR(100) NOT NULL 
          DEFAULT 'Sample data'
    , PRIMARY KEY (id)
    , INDEX t_IX (`timestamp`, id)
    ) ;

INSERT INTO test
    (`timestamp`)
VALUES
    ('2013-02-08 00:01:12'),
    ---                                      --- insert about 7k rows
    ('2013-02-08 20:01:12') ;

Давайте попробуем 2 версии сейчас.


Версия 1 с DATE(timestamp) = ?

EXPLAIN
SELECT * FROM test 
WHERE DATE(timestamp) = CURDATE()            ---  using DATE(timestamp)
ORDER BY timestamp ;

Объясняю:

ID  SELECT_TYPE  TABLE  TYPE  POSSIBLE_KEYS  KEY  KEY_LEN  REF 
1   SIMPLE       test   ALL

ROWS  FILTERED  EXTRA
6671  100       Using where; Using filesort

Он фильтрует все строки (6671), а затем делает fileort (это не проблема, поскольку возвращенные строки немного)


Версия 2 с timestamp <= ? AND timestamp < ?

EXPLAIN
SELECT * FROM test 
WHERE timestamp >= CURDATE()
  AND timestamp < CURDATE() + INTERVAL 1 DAY
ORDER BY timestamp ;

Объясняю:

ID  SELECT_TYPE  TABLE  TYPE  POSSIBLE_KEYS  KEY  KEY_LEN  REF 
1   SIMPLE       test   range t_IX           t_IX    9 

ROWS  FILTERED  EXTRA
2     100       Using where

Он использует сканирование диапазона по индексу, а затем считывает только соответствующие строки из таблицы.

Ответ 3

SELECT * FROM 'table' WHERE timestamp >= CURDATE()

короче, нет необходимости использовать 'AND timestamp <CURDATE() + INTERVAL 1 DAY'

потому что CURDATE() всегда возвращает текущий день

MySQL CURDATE() функция

Ответ 4

Просто добавьте его к дате:

SELECT * FROM `table` WHERE CAST(`timestamp` TO DATE) == CAST(NOW() TO DATE)

Ответ 5

Сколько способов мы можем скрыть эту кошку? Вот еще один вариант.

SELECT * FROM table ГДЕ ДАТА (FROM_UNIXTIME (timestamp)) = '2015-11-18';

Ответ 6

Если вы хотите сравнить с определенной датой, вы можете написать ее так:

выберите * из table_name где timestamp> = '2018-07-07';

//здесь отметка времени - это имя столбца, имеющего тип как отметка времени

или же

Для получения сегодняшней даты доступна функция CURDATE(), поэтому:

выберите * из table_name где timestamp> = CURDATE();

Ответ 7

На Visual Studio 2017, используя встроенную базу данных для разработки, у меня были проблемы с текущим данным решением, мне пришлось изменить код, чтобы он работал, потому что он выдавал ошибку, что DATE() не была встроенной функцией.

Вот мое решение:

where CAST(TimeCalled AS DATE) = CAST(GETDATE() AS DATE)

Ответ 8

Это может быть самым простым на мой взгляд:

SELECT * FROM `table` WHERE `timestamp` like concat(CURDATE(),'%');