Як порівняти дати мітки часу з параметром лише дати в MySQL?


88

Як в операторі SQL можна порівняти дату, збережену як TIMESTAMP, з датою у форматі РРРР-ММ-ДД?

Приклад: SELECT * FROM table WHERE timestamp = '2012-05-05'

Я хочу, щоб цей запит повертав усі рядки, що мають позначку часу у вказаний день, але повертає лише ті рядки, які мають позначку часу опівночі.

Дякую

Відповіді:


144

Ви можете використовувати DATE()функцію для вилучення частини дати мітки часу:

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

Хоча, якщо у вас є індекс у стовпці позначки часу, це було б швидше, оскільки він міг би використовувати індекс у стовпці позначки часу, якщо у вас є такий:

SELECT * FROM table
WHERE timestamp BETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59'

5
За допомогою невеликого тесту, який я щойно провів, я виявив, що використання МІЖ МІЖ швидше в 10 разів - просто FYI
DarbyM


6

Як пропонують деякі, за допомогою 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'

5
SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00' 
    AND timestamp <= '2012-05-05 23:59:59'

2

Використовуйте функцію перетворення MYSQL:

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

Це має спрацювати


1

Досліджуючи це, я вважав, що було б непогано змінити рішення МІЖ, щоб показати приклад для певної нестатичної / рядкової дати, а швидше змінної дати, або сьогоднішньої, наприклад CURRENT_DATE(). Це ВИКОРИСТОВУЄ індекс у стовпці log_timestamp.

SELECT *
FROM some_table
WHERE
    log_timestamp
    BETWEEN 
        timestamp(CURRENT_DATE()) 
    AND # Adds 23.9999999 HRS of seconds to the current date
        timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL '86399.999999' SECOND_MICROSECOND));

Я зробив секунди / мікросекунди, щоб уникнути справи 12:00 наступного дня. Однак ви також можете зробити `` ІНТЕРВАЛ '' 1 ДЕНЬ '' за допомогою операторів порівняння для більш зручного для читачів підходу, не пов'язаного МІЖ:

SELECT *
FROM some_table
WHERE
    log_timestamp >= timestamp(CURRENT_DATE()) AND
    log_timestamp < timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY));

Обидва ці підходи використовуватимуть індекс і повинні виконувати НАБАГАТО швидше. Обидва здаються однаково швидкими.


0

Якщо ви використовуєте параметри SQL для запуску запиту, це було б корисно

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

0

Коли я прочитав ваше запитання, я думав, що ви працюєте в Oracle DB, поки не побачив тег "MySQL". У будь-якому випадку, для людей, які працюють з Oracle, є такий спосіб:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.