JavaRush /Курси /SQL SELF /Функції для отримання поточної дати та часу: NOW()...

Функції для отримання поточної дати та часу: NOW(), CURRENT_DATE, CURRENT_TIME

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

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(). З їх допомогою можна, наприклад, легко визначити вік людини або обробляти дані по днях, місяцях чи роках.

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