Вибір записів по тимчасовим характеристикам

завдання
Ви хочете вибирати записи по їх тимчасовим характеристикам.

Рішення
Використовуйте умова для часу або дати в інструкції 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