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 знайшов цілих три рядки. Подумай, чому минулого разу був один рядок, а цього разу — три?