PostgreSQL пропонує кілька вбудованих функцій для роботи з поточними часовими значеннями. Ці функції корисні для задач типу автоматичного відстеження часу створення запису, побудови звітів на основі поточної дати або перевірки, чи відбулася подія у заданий період. Давай розглянемо три основні функції: NOW(), CURRENT_DATE і CURRENT_TIME.
NOW(): отримання поточної дати та часу
Функція NOW() повертає поточну дату і час у форматі TIMESTAMP WITH TIME ZONE. Це значить, що результат функції включає точний час з урахуванням часового поясу сервера.
Приклад:
SELECT NOW();
-- Результат: 2025-05-25 14:30:45.761523+03
Зверни увагу, що результат включає:
- дату (
2025-05-25), - час (
14:30:45.761523), - часовий пояс (
+03).
Якщо тобі не потрібен часовий пояс, можна явно привести результат до TIMESTAMP:
SELECT NOW()::TIMESTAMP;
-- Результат: 2025-05-25 14:30:45.761523
CURRENT_DATE: отримання поточної дати
Функція CURRENT_DATE повертає тільки поточну дату без часу. Тип повернутого значення — DATE.
Приклад:
SELECT CURRENT_DATE;
-- Результат: 2025-05-25
Це зручно використовувати, якщо тобі не треба враховувати час, наприклад, при розрахунку віку або при групуванні даних по днях.
CURRENT_TIME: отримання поточного часу
Функція CURRENT_TIME повертає поточний час у форматі TIME WITH TIME ZONE. Якщо часовий пояс не потрібен, можна привести результат до TIME.
Приклад:
SELECT CURRENT_TIME;
-- Результат: 14:30:45.761523+03
SELECT CURRENT_TIME::TIME;
-- Результат: 14:30:45.761523
Приклади використання функцій
Давай глянемо кілька практичних прикладів, де ці функції реально корисні.
Автоматичне заповнення часу створення запису
Коли додаємо записи в таблицю, часто буває зручно автоматично зберігати дату і час їх створення. В PostgreSQL це можна зробити, вказавши DEFAULT NOW() при створенні таблиці.
Приклад створення таблиці:
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_name TEXT NOT NULL,
created_at TIMESTAMP DEFAULT NOW() -- момент створення рядка
);
Додавання запису:
INSERT INTO orders (customer_name) VALUES ('Otto Lin');
Дивимось на вміст таблиці:
SELECT * FROM orders;
Результат:
| id | customer_name | created_at |
|---|---|---|
| 1 | Otto Lin | 2024-11-25 14:45:12.154678 |
Фільтрація даних по даті
Уявімо, що у нас є таблиця замовлень, і ми хочемо вибрати всі замовлення, створені сьогодні. Використаємо функцію CURRENT_DATE для фільтрації:
SELECT *
FROM orders
WHERE created_at::DATE = CURRENT_DATE;
Тут ми використовуємо приведення created_at::DATE, щоб відкинути час і залишити тільки дату.
Відмінності між NOW() і CURRENT_TIMESTAMP
На перший погляд, здається, що NOW() і CURRENT_TIMESTAMP роблять одне й те саме. По суті, так і є. Просто функція NOW() прийшла з одного стандарту, а CURRENT_TIMESTAMP — з іншого.
NOW() — PostgreSQL-функція
Функція NOW() є вбудованою функцією PostgreSQL, яка повертає значення типу TIMESTAMP WITH TIME ZONE (timestamptz). Це поточний час сервера на момент старту виконання SQL-запиту.
Приклад:
SELECT NOW();
CURRENT_TIMESTAMP — стандарт SQL
CURRENT_TIMESTAMP — це вираз, визначений стандартом SQL, і він теж повертає TIMESTAMP WITH TIME ZONE в PostgreSQL. По суті, PostgreSQL реалізує CURRENT_TIMESTAMP як виклик тієї ж функції, що і NOW().
Приклад:
SELECT CURRENT_TIMESTAMP;
Порівняння на практиці
SELECT NOW(), CURRENT_TIMESTAMP;
Результат:
| now | current_timestamp |
|---|---|
| 2025-05-25 14:30:45+03 | 2025-05-25 14:30:45+03 |
Обидва значення співпадають, бо обчислені в один момент — на початку запиту.
Використання часових функцій у фільтрах
Тепер спробуємо написати запит, який вибирає записи, створені за останні 7 днів. Для цього можна використати NOW() з арифметикою над датами:
SELECT *
FROM orders
WHERE created_at >= NOW() - INTERVAL '7 days';
Аналогічно, якщо треба вибрати замовлення за поточний місяць, можна використати функцію DATE_TRUNC(), щоб обрізати початок і кінець місяця:
SELECT *
FROM orders
WHERE created_at >= DATE_TRUNC('month', NOW());
DATE_TRUNC() — цікава функція, детальніше про неї розкажу через пару лекцій :P
Практичні поради
- Використовуй
NOW()абоCURRENT_TIMESTAMP, якщо треба точний час з урахуванням часового поясу. - Застосовуй
CURRENT_DATE, якщо для твоєї задачі достатньо тільки дати (наприклад, при розрахунках віку або аналізі подій за певний день). CURRENT_TIMEнайчастіше юзають для обліку часу у звітах або інтерфейсах, де важливо показати, скільки часу витрачено на задачу.
У наступній лекції почнемо витягати частини дат і часу, використовуючи функції EXTRACT() і AGE(). З їх допомогою можна, наприклад, легко визначити вік людини або обробляти дані по днях, місяцях чи роках.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ