Как сравнить даты timestamp с параметром date-only в MySQL?
В инструкции SQL, как сравнить дату, сохраненную как TIMESTAMP, с датой в формате YYYY-MM-DD?
Пример: SELECT * FROM table WHERE timestamp = '2012-05-05'
Я хочу, чтобы этот запрос возвращал все строки с меткой времени в указанный день, но он возвращает только строки, имеющие метку времени в полночь.
спасибо
Ответы
Ответ 1
Вы можете использовать функцию 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'
Ответ 2
WHERE cast(timestamp as date) = '2012-05-05'
Ответ 3
SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00'
AND timestamp <= '2012-05-05 23:59:59'
Ответ 4
Используйте функцию преобразования MYSQL:
SELECT * FROM table WHERE DATE(timestamp) = '2012-05-05'
Это должно работать
Ответ 5
Как полагают некоторые, используя 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'
Ответ 6
Если вы используете SQL-параметры для запуска запроса, это было бы полезно
SELECT * FROM table WHERE timestamp between concat(date(?), ' ', '00:00:00') and concat(date(?), ' ', '23:59:59')
Ответ 7
использование
SELECT * FROM table WHERE DATE(2012-05-05 00:00:00) = '2012-05-05'
Ответ 8
Когда я прочитал ваш вопрос, я подумал, что вы были Oracle DB, пока не увидели тег 'MySQL'. В любом случае, для людей, работающих с Oracle, это способ:
SELECT *
FROM table
where timestamp = to_timestamp('21.08.2017 09:31:57', 'dd-mm-yyyy hh24:mi:ss');