1. Шукаємо події за останні 30 днів
Ще одне завдання, що часто виникає, — пошук рядків, які відносяться до певного діапазону дат. У принципі, у цьому немає нічого складного, якщо початкова і кінцева дати діапазону фіксовані: SQL вміє порівнювати дати так само добре, як і числа.
До дат можна використовувати оператори порівняння: <, >, <= тощо. Крім того, є спеціальний оператор BETWEEN, який також вміє працювати з датами. Давай напишемо запит, який відбере всі завдання з таблиці task, які потрібно зробити влітку 2022 року. Запит виглядатиме так:
SELECT * FROM task
WHERE task.deadline BETWEEN '2022-06-01' AND '2022-08-31'
Результат цього запиту буде таким:
id | emploee_id | name | deadline |
---|---|---|---|
1 | 1 | Виправити багу на фронтенді | 2022-06-01 |
2 | 2 | Виправити багу на бекенді | 2022-06-15 |
3 | 5 | Купити каву | 2022-07-01 |
4 | 5 | Купити каву | 2022-08-01 |
Але що писати у запиті, якщо ми хочемо отримати завдання, наприклад, за останні 30 днів, де останні 30 днів прямо прив'язані до часу виконання запиту. Тобто, якщо запит виконується 25 липня, потрібно обрати дати з 25 червня по 24 липня. Як прив'язати інтервал дат до поточного часу?
Для цього потрібно скористатися функцією складання дат:
DATE_ADD (дата, INTERVAL вираз одиниці)
Думаю, легше пояснити за допомогою декількох прикладів:
# | Запит | Результат |
---|---|---|
1 | DATE_ADD('2022-06-04', INTERVAL 5 DAY) | 2022-06-09 |
2 | DATE_ADD('2022-06-04', INTERVAL 4 WEEK) | 2022-07-02 |
3 | DATE_ADD('2022-06-04', INTERVAL 2 MONTH) | 2022-08-04 |
4 | ||
5 | DATE_SUB('2022-06-04', INTERVAL 5 DAY) | 2022-05-30 |
6 | DATE_SUB('2022-06-04', INTERVAL 4 WEEK) | 2022-05-07 |
7 | DATE_SUB('2022-06-04', INTERVAL 2 MONTH) | 2022-04-04 |
До речі, з певної дати можна так само вирахувати певну кількість днів, тижнів, місяців та років.
І якщо повернутись до нашого запиту — отримати дані за останні 30 днів — нам потрібні дві дати цього діапазону:
- CURDATE() — кінець діапазону
- DATE_SUB( CURDATE() , INTERVAL 30 DAY) — початок діапазону
Запит виглядатиме так:
SELECT * FROM task WHERE task.deadline
BETWEEN DATE_SUB( CURDATE() , INTERVAL 30 DAY) AND CURDATE()
Результат цього запиту буде таким (у мене сьогодні 4 червня 2022 року):
id | emploee_id | name | deadline |
---|---|---|---|
1 | 1 | Виправити багу на фронтенді | 2022-06-01 |
2. Як знайти різницю між двома датами
І ще одна корисна функція. Іноді може знадобитися розрахувати різницю між двома датами на днях. Для цього SQL має спеціальну функцію — DATEDIFF().
Працювати з нею дуже просто:
DATEDIFF (дата1, дата2)
З першої дати просто віднімається друга. Якщо дата2 відбувається після дата1, то результат буде негативним.
До речі, ми можемо переписати наш попередній запит, використовуючи функцію DATEDIFF(). Нам потрібно відібрати всі завдання з таблиці task, дедлайн яких відрізняється від поточної дати не більше ніж на 30 днів. Ось як виглядатиме цей запит:
SELECT * FROM task WHERE DATEDIFF(task.deadline, CURDATE() ) < 30 AND DATEDIFF(task.deadline, CURDATE() ) > -30
Результат цього запиту буде таким (у мене сьогодні 4 червня 2022 року):
id | emploee_id | name | deadline |
---|---|---|---|
1 | 1 | Виправити багу на фронтенді | 2022-06-01 |
2 | 2 | Виправити багу на бекенді | 2022-06-15 |
3 | 5 | Купити каву | 2022-07-01 |
Цього разу SQL знайшов цілих три рядки. Подумай, чому минулого разу був один рядок, а цього разу — три?
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ