Дати й час — це не просто абстрактні цифри, а ключ до безцінної інформаційної частини даних. У реальному житті ти часто стикаєшся з датами: наприклад, аналіз продажів по місяцях, фільтрація по даті народження співробітників або порівняння часових інтервалів. Знання, як оперувати датами, дозволяє будувати більш гнучкі запити й робити складні аналітичні висновки.
Приклади, де робота з датами критично важлива:
- Аналіз продажів за конкретний місяць.
- Підрахунок кількості користувачів, які зареєструвалися за останній рік.
- Побудова звітів по часових інтервалах (наприклад, щомісячні доходи).
У PostgreSQL є купа функцій для роботи з датами, і зараз ми розглянемо тільки найкорисніші з них.
Основні функції для роботи з датами і часом
Функція NOW() повертає поточну дату й час для сервера бази даних. Вона використовується, коли тобі треба дізнатися точний поточний час. Наприклад: ти хочеш записати час створення нового запису.
SELECT NOW();
Приклад результату:
2023-11-05 15:23:45.123456+00
Приклад використання: Ти хочеш вставити запис про замовлення з поточною датою і часом:
INSERT INTO orders (order_id, order_date, total_amount)
VALUES (1, NOW(), 150.00);
Коментар: тут
NOW() автоматично додасть поточну дату й час у стовпець
order_date.
Як саме працює оператор INSERT ти дізнаєшся в наступних лекціях :P
Функція CURRENT_DATE
Якщо тобі треба просто вставити поточну дату без урахування часу, використовуй CURRENT_DATE. Вона повертає тільки рік, місяць і день.
Синтаксис:
SELECT CURRENT_DATE;
Приклад результату:
2023-11-05
Приклад використання: Припустимо, ти хочеш отримати записи за поточний день:
SELECT *
FROM orders
WHERE order_date = CURRENT_DATE;
Коментар: тут ми порівнюємо дату зі стовпця
order_date з поточною датою.
Додамо трохи гумору. NOW() — це як твоя кава на роботі: готова прямо зараз. А CURRENT_DATE — це як календар на стіні: тільки дата, без зайвих подробиць.
Витягування частин дати за допомогою DATE_PART()
Функція DATE_PART() дозволяє отримати певну частину дати, наприклад рік, місяць, день, годину або хвилину. Це зручно, наприклад, щоб порахувати кількість замовлень за певний рік або визначити день тижня.
Синтаксис:
DATE_PART('частина', дата)
Приклад:
SELECT DATE_PART('year', NOW()) AS current_year;
Приклад результату:
| current_year |
|---|
| 2025 |
Частини дати, які можна витягти:
year: рік.month: місяць.day: день.hour: година.minute: хвилина.second: секунда.dow: день тижня (0 = неділя).
Приклад 2: Витягуємо місяць з поточної дати.
SELECT DATE_PART('month', CURRENT_DATE) AS current_month;
Результат:
| current_month |
|---|
| 6 |
Можна використовувати DATE_PART() для складних обчислень. Наприклад:
Ти хочеш вибрати тільки тих користувачів, які народилися в поточному році:
SELECT *
FROM students
WHERE DATE_PART('year', birth_date) = DATE_PART('year', CURRENT_DATE);
Приклад результату:
| id | first_name | last_name | birth_date | grade |
|---|---|---|---|---|
| 1 | Otto | Art | 2025-03-12 | 9 |
| 2 | Anna | Pal | 2025-07-08 | 8 |
| 3 | Piu | Wolf | 2025-01-22 | 10 |
| 4 | Eva | Go | 2025-09-30 | 7 |
| 5 | Dan | Sok | 2025-06-14 | 9 |
Практичні приклади
У деяких прикладах будуть оператори, які ти ще не вчив. Не переймайся, скоро ти будеш клацати такі приклади як насіння. Просто хочеться показати тобі побільше реальних прикладів з життя. Ну і трохи заінтригувати :)
Приклад 1: Визначення віку користувача
Припустимо, у нас є таблиця users з датою народження кожного користувача. Ми хочемо порахувати їхній вік.
Запит:
SELECT user_id, first_name, last_name,
DATE_PART('year', CURRENT_DATE) - DATE_PART('year', birth_date) AS age
FROM users;
Ми просто віднімаємо роки з поточної дати і дати народження. Це швидкий, але не точний спосіб отримати вік.
Приклад результату:
| user_id | first_name | last_name | age |
|---|---|---|---|
| 101 | Alex | Lin | 25 |
| 102 | Maria | Chi | 30 |
| 103 | Tor | Coz | 22 |
| 104 | Nat | Ive | 27 |
| 105 | Don | Sok | 35 |
Приклад 2: Фільтрація по часу
Якщо ти хочеш вибрати всі замовлення, зроблені за останню годину:
SELECT *
FROM orders
WHERE order_date >= NOW() - INTERVAL '1 hour';
Зверни увагу, як зручно використовувати INTERVAL (позначення інтервалу часу).
Приклад 3: Групування по місяцях
Ти хочеш порахувати кількість замовлень за кожен місяць поточного року:
SELECT DATE_PART('month', order_date) AS order_month, COUNT(*) AS order_count
FROM orders
WHERE DATE_PART('year', order_date) = DATE_PART('year', CURRENT_DATE)
GROUP BY DATE_PART('month', order_date)
ORDER BY order_month;
Групування виконується по номеру місяця, а результат сортується по ньому ж.
Приклад результату:
| order_month | order_count |
|---|---|
| 1 | 120 |
| 2 | 95 |
| 3 | 134 |
| 4 | 110 |
| 5 | 42 |
Приклад 4: Витягування дня тижня
Ти хочеш дізнатися, в який день тижня зроблено найбільше замовлень:
SELECT DATE_PART('dow', order_date) AS day_of_week, COUNT(*) AS order_count
FROM orders
GROUP BY DATE_PART('dow', order_date)
ORDER BY order_count DESC;
Команда DATE_PART('dow') поверне день тижня для кожного замовлення як число, де 0 — неділя, 1 — понеділок, і так далі. DOW - це скорочення від DayOfWeek - день тижня.
Приклад результату:
| day_of_week | order_count |
|---|---|
| 5 | 210 |
| 4 | 190 |
| 3 | 175 |
| 2 | 160 |
| 1 | 140 |
| 6 | 120 |
| 0 | 95 |
Зверни увагу на типові помилки
Робота з датами часто викликає головний біль через помилки. Ось кілька поширених проблем, з якими ти можеш зіткнутися:
Формат часу і дати: коли ти використовуєш NOW() або будь-яку функцію, яка повертає дату з часом, обов'язково перевіряй її формат. Наприклад, якщо ти порівнюєш order_date з CURRENT_DATE, переконайся, що час ігнорується або явно вказаний.
Дата у рядковому форматі: часто в базах даних дати зберігаються як рядки (наприклад, текст). Якщо ти спробуєш використовувати функції для роботи з датами (наприклад, DATE_PART()), то отримаєш помилку. Переконайся, що дані мають тип DATE або TIMESTAMP.
Різні часові пояси: якщо у тебе сервер працює в одному часовому поясі, а дані збираються з іншого, це може призвести до плутанини. Розглянь використання часового поясу TIMESTAMPTZ.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ