it-swarm.com.ru

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

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

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

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

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

83
Jackie Honson

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

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

Я думаю используя DATEвсе еще использует INDEX

см план выполнения на ДЕМО

157
John Woo

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

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) строки, а затем выполняет сортировку файлов (это не проблема, так как возвращаемых строк немного)


Версия 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

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

47
ypercubeᵀᴹ
SELECT * FROM `table` WHERE timestamp >= CURDATE()

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

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

Функция MySQL CURDATE ()

7
Hamed Persia

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

SELECT * FROM table WHERE DATE (FROM_UNIXTIME (timestamp)) = '2015-11-18';

2
stefgosselin

Просто приведите это к дате:

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

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

select * from `table_name` where timestamp >= '2018-07-07';

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

или же 

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

select * from `table_name` where timestamp >=  CURDATE();
0
ViditAgarwal

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

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

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

0
Cesar Bourdain Costa

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

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