CURRENT_DATE, NOW() и CURRENT_TIMESTAMP — текущая дата и время в SQL

Эти конструкции возвращают текущий момент: CURRENT_DATE — только дату без времени, CURRENT_TIMESTAMP и NOW() — дату вместе со временем. Аналитику они нужны для фильтров «за сегодня», «за 30 дней», для меток времени при вставке и для расчёта возраста/срока. Нюанс диалектов: CURRENT_DATE и CURRENT_TIMESTAMP — стандарт SQL и работают в PostgreSQL, MySQL и SQLite, а вот NOW() есть в PostgreSQL и MySQL, но в SQLite его нет — там пишут datetime('now').

Синтаксис

CURRENT_DATE -- текущая дата, без времени и без скобок CURRENT_TIMESTAMP -- дата и время (стандарт, все диалекты) NOW() -- дата и время (PostgreSQL, MySQL)

Примеры использования

Пример 1: Заказы за сегодня

SELECT COUNT(*) AS today_orders
FROM orders
WHERE created_at::date = CURRENT_DATE;

Результат:

today_orders
------------
87

Пример 2: Регистрации за последнюю неделю

SELECT COUNT(*) AS week_users
FROM users
WHERE registered_at >= CURRENT_DATE - 7;

Результат:

week_users
----------
312

Пример 3: Метка времени при выборке

SELECT event_type, NOW() AS fetched_at
FROM events
LIMIT 2;

Результат:

event_type | fetched_at
-----------+------------------------------
click      | 2026-07-11 14:35:20.145+03
view       | 2026-07-11 14:35:20.145+03
Порешать SQL-задачи в тренажёре →

Типичная ошибка

NOW() и CURRENT_TIMESTAMP фиксируются на момент старта транзакции/оператора — все строки одного запроса получат одинаковое время, а не «реальное» на каждую строку (для этого в PostgreSQL есть clock_timestamp()). CURRENT_DATE пишется без скобок. В SQLite функции NOW() нет — используйте datetime('now') или CURRENT_TIMESTAMP, и учтите, что они отдают время в UTC.

Где спрашивают на собеседовании

Спрашивают почти в любой задаче с фильтром «за период»; в паре с INTERVAL (сдвиг дат) и DATE_TRUNC (усечение до дня/месяца).

FAQ: частые вопросы про CURRENT_DATE

Работает ли NOW() в SQLite?

Нет, такой функции в SQLite нет — запрос упадёт с ошибкой. Вместо неё используйте datetime('now') или CURRENT_TIMESTAMP, обе возвращают время в UTC. NOW() доступна в PostgreSQL и MySQL, а CURRENT_DATE / CURRENT_TIMESTAMP — во всех трёх диалектах.

Чем CURRENT_TIMESTAMP отличается от NOW()?

В PostgreSQL это синонимы: обе возвращают timestamptz на момент начала транзакции. Разница косметическая — CURRENT_TIMESTAMP входит в стандарт SQL и переносимее, NOW() короче и привычнее по MySQL. В обеих время в транзакции не «тикает».

Почему все строки получили одинаковое время?

NOW() и CURRENT_TIMESTAMP вычисляются один раз на транзакцию, а не на каждую строку — это by design, чтобы данные были консистентны. Если нужно реальное время выполнения каждой строки, в PostgreSQL используйте clock_timestamp().

Вопросы с собеседований по теме

Смежные темы SQL

Работа с датами

Другие функции SQL

LAG · date_trunc · EXTRACT · strftime · TO_CHAR · AGE

Открыть SQL-тренажёр (565 задач) →