Как сравнить дату отметки времени с параметром только для даты в MySQL?


в инструкции SQL, как я могу сравнить дату, сохраненную как отметка времени с датой в формате гггг-ММ-ДД?

Ex.:SELECT * FROM table WHERE timestamp = '2012-05-05'

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

спасибо

8 52

8 ответов:

можно использовать DATE() функция для извлечения части даты метки времени:

SELECT * FROM table
WHERE DATE(timestamp) = '2012-05-05'

хотя, если у вас есть индекс для столбца timestamp, это будет быстрее, потому что он может использовать индекс:

SELECT * FROM table
WHERE timestamp BETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59'
SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00' 
    AND timestamp <= '2012-05-05 23:59:59'
 WHERE cast(timestamp as date) = '2012-05-05'

используйте функцию преобразования MYSQL:

SELECT * FROM table WHERE DATE(timestamp) = '2012-05-05' 

Это должно работать

Use  

SELECT * FROM table WHERE DATE(2012-05-05 00:00:00) = '2012-05-05' 

в случае, если вы используете параметры SQL для выполнения запроса, то это будет полезным

SELECT * FROM table WHERE timestamp between concat(date(?), ' ', '00:00:00') and concat(date(?), ' ', '23:59:59')

когда я прочитал Ваш вопрос, я думал, что вы были на Oracle DB пока я не увидел тег 'MySQL'. Во всяком случае, для людей, работающих с Oracle, вот так:

SELECT *
FROM table
where timestamp = to_timestamp('21.08.2017 09:31:57', 'dd-mm-yyyy hh24:mi:ss');

как предлагают некоторые, с помощью DATE(timestamp) вы применяете манипуляции к столбцу, и поэтому вы не можете полагаться на порядок индексов.

, используя BETWEEN будет надежным только в том случае, если вы включите миллисекунды. В Примере метку BETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59' вы исключаете записи с меткой времени между 2012-05-05 23:59:59.001 и 2012-05-05 23:59:59.999. Однако даже этот метод имеет некоторые проблемы, из-за точности типов данных. Иногда 999 миллисекунд округляется.

лучшие что нужно сделать, так это:

SELECT * FROM table
WHERE date>='2012-05-05' AND date<'2012-05-06'