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;
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().