EXTRACT, DATE_TRUNC, AGE
Извлекайте части даты с помощью EXTRACT, округляйте временные метки до границы с DATE_TRUNC и вычисляйте понятные человеку разницы с AGE
«EXTRACT, DATE_TRUNC, AGE» — бесплатный урок SQL Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
EXTRACT: извлечение компонента даты
EXTRACT(part FROM ts) возвращает один числовой компонент:
SELECT EXTRACT(YEAR FROM created_at) AS yr,
EXTRACT(MONTH FROM created_at) AS mo,
EXTRACT(DAY FROM created_at) AS d,
EXTRACT(DOW FROM created_at) AS day_of_week
FROM orders;Распространённые компоненты EXTRACT
Полезные компоненты: YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, DOW (0=Sun), DOY (1–366), WEEK, QUARTER, EPOCH.
SELECT EXTRACT(EPOCH FROM (NOW() - created_at)) AS seconds_ago
FROM events;DATE_TRUNC: привязка к границе
DATE_TRUNC(unit, ts) обнуляет всё, что находится ниже указанной единицы, — это самая полезная функция для отчётов с группировкой по периодам:
SELECT date_trunc('day', NOW()); -- 2024-03-15 00:00:00
SELECT date_trunc('week', NOW());
SELECT date_trunc('month', NOW());
SELECT date_trunc('hour', NOW());Отчёты с группировкой по периодам
Месячная выручка с использованием date_trunc:
SELECT date_trunc('month', created_at) AS month,
SUM(total) AS revenue
FROM orders
GROUP BY 1
ORDER BY 1;С начала года / с начала месяца
Сравнение текущего периода с тем же моментом прошлого года:
-- This month so far
SELECT SUM(total) FROM orders
WHERE created_at >= date_trunc('month', NOW())
AND created_at < date_trunc('month', NOW()) + INTERVAL '1 month';AGE: разница с учётом календаря
AGE возвращает годы, месяцы и дни, а не только дни:
SELECT AGE('2024-03-15', '2020-12-01');
-- → '3 years 3 months 14 days'
SELECT EXTRACT(YEAR FROM AGE('2024-03-15', '2020-12-01')); -- 3Поведение AGE с двумя аргументами
AGE с одним аргументом сравнивает дату с current_date:
SELECT AGE(birth_date) FROM users LIMIT 5;Логика дней недели
EXTRACT(DOW): 0 = воскресенье … 6 = суббота. ISO_DOW: 1 = понедельник … 7 = воскресенье.
SELECT * FROM orders
WHERE EXTRACT(ISODOW FROM created_at) IN (6, 7); -- weekend ordersЧасовой пояс в EXTRACT
EXTRACT для TIMESTAMPTZ использует часовой пояс сеанса. Используйте AT TIME ZONE, чтобы управлять им:
SELECT EXTRACT(HOUR FROM created_at AT TIME ZONE 'UTC') FROM events;
SELECT EXTRACT(HOUR FROM created_at AT TIME ZONE 'Europe/Berlin') FROM events;Усечение по пользовательскому интервалу
Для интервалов, не привязанных к календарю (например, каждые 5 минут), используйте арифметику:
SELECT to_timestamp(
floor(EXTRACT(EPOCH FROM created_at) / 300) * 300
) AS bucket_5min,
COUNT(*)
FROM events
GROUP BY 1
ORDER BY 1;Функциональные индексы для усечения
Если вы часто выполняете GROUP BY по date_trunc('day', created_at), поможет функциональный индекс:
CREATE INDEX events_day_idx ON events ((date_trunc('day', created_at)));Повторение
EXTRACT, DATE_TRUNC и AGE покрывают большинство потребностей в отчётах.
- EXTRACT для отдельных компонентов
- DATE_TRUNC для привязки к границе
- AGE для промежутков с учётом календаря
Быстрая проверка
Вы хотите подсчитать новых пользователей по месяцам. Какая функция группирует даты по месяцам?
Часто задаваемые вопросы
Урок «EXTRACT, DATE_TRUNC, AGE» бесплатный?
Да — полный текст урока «EXTRACT, DATE_TRUNC, AGE» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «EXTRACT, DATE_TRUNC, AGE»?
Извлекайте части даты с помощью EXTRACT, округляйте временные метки до границы с DATE_TRUNC и вычисляйте понятные человеку разницы с AGE Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «EXTRACT, DATE_TRUNC, AGE»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Арифметика дат и INTERVAL
- EXTRACT, DATE_TRUNC, AGE
- Часовые пояса: TIMESTAMP и TIMESTAMPTZ
- Распространённые отчёты по датам (MTD, WoW, YoY)