Вибір записів по тимчасовим характеристикам
завдання
Ви хочете вибирати записи по їх тимчасовим характеристикам.
Рішення
Використовуйте умова для часу або дати в інструкції WHERE. Можна порівнювати безпосередньо значення стовпців з відомими значеннями. А можна застосувати до значень стовпців функцію, щоб перетворити їх в більш зручний для перевірок формат, наприклад, можна використовувати MONTH () для перевірки складової місяці дат.
Обговорення
Велика частина вивчених прийомів роботи зі значеннями дат ілюструвалося прикладами, які виводять значення дати і часу. Ті ж самі прийоми можна використовувати в інструкціях WHERE для накладення тимчасових обмежень на записи, які обираються запитом. Наприклад, можна вибирати записи, які стосуються дат, які передують заданої, що входять в певний діапазон або відповідним певним значенням місяця або дня.
Порівняння дат один з одним
Наступні запити знаходять записи таблиці date_val, що відносяться до періоду до 1900 року або до 1900-х років:
Якщо ви працюєте з більш ранньою, ніж 3.23.9, версією MySQL, то інструкція BETWEEN може не завжди коректно працювати із строковими літералами дат, що мають формат НЕ-ISO.
Наприклад, може відбутися збій при виконанні такого запиту:
SELECT d FROM date_val WHERE d BETWEEN '1960-3-1' AND '1960-3-15';
Якщо це сталося, спробуйте перетворити дати в формат ISO:
SELECT d FROM date_val WHERE d BETWEEN '1960-03-01' AND '1960-03-15';
Також можна переписати вираз, використовуючи два явних порівняння:
SELECT d FROM date_val WHERE d> = '1960-03-01' AND d SELECT d FROM date_val WHERE d> = DATE_SUB (CURDATE (), INTERVAL 6 YEAR);
Зверніть увагу на те, що в вираженні інструкції WHERE стовпець дати d розташований відокремлено - він один знаходиться зліва від оператора порівняння.
Якщо стовпець індексований, то зазвичай така форма запиту обрабативаетсяв MySQL найбільш ефективно. Можна було б записати інструкцію WHERE іншим способом, який логічно еквівалентний попередньому, але виконується повільніше:
WHERE DATE_ADD (d, INTERVAL 6 MONTH)> = CURDATE ();
В даному випадку стовпець d використовується всередині виразу, тобто вилучатись для обчислення та вираження буде кожен рядок - виходить, що індекс не затребуваний.
Іноді не відразу зрозуміло, як переформулювати порівняння так, щоб стовпчик дати виявився ізольованим по одну сторону від оператора порівняння. Наприклад, така інструкція WHERE використовує в порівнянні тільки частина стовпчика дат:
WHERE YEAR (d)> = 1 987 AND YEAR (d) = '1987-01-01' AND YEAR (d) = '1987-01-01' AND d = '1987-01-01' AND d = '1987 01-01 'AND d