JavaRush /Курси /SQL SELF /Форматування дат і часу: NOW(), CURR...

Форматування дат і часу: NOW(), CURRENT_DATE, DATE_PART()

SQL SELF
Рівень 5 , Лекція 2
Відкрита

Дати й час — це не просто абстрактні цифри, а ключ до безцінної інформаційної частини даних. У реальному житті ти часто стикаєшся з датами: наприклад, аналіз продажів по місяцях, фільтрація по даті народження співробітників або порівняння часових інтервалів. Знання, як оперувати датами, дозволяє будувати більш гнучкі запити й робити складні аналітичні висновки.

Приклади, де робота з датами критично важлива:

  • Аналіз продажів за конкретний місяць.
  • Підрахунок кількості користувачів, які зареєструвалися за останній рік.
  • Побудова звітів по часових інтервалах (наприклад, щомісячні доходи).

У 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.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ