0Pricing
SQL Academy · Урок

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 — локальная установка не требуется.

Все уроки этого курса

  1. Арифметика дат и INTERVAL
  2. EXTRACT, DATE_TRUNC, AGE
  3. Часовые пояса: TIMESTAMP и TIMESTAMPTZ
  4. Распространённые отчёты по датам (MTD, WoW, YoY)
← Назад к SQL Academy