Даты и время: вопросы для собеседования (часть 2)

Работа с датами в SQL — это DATE_TRUNC, EXTRACT, интервалы, приведение типов и группировка по временным периодам. На собеседованиях часто просят посчитать метрику по неделям или месяцам, найти разницу между датами, или отфильтровать данные за скользящее окно. Ошибки в работе с таймзонами и форматами дат — частая причина провала на интервью.

Агрегация, GROUP BY и HAVINGEXPLAIN и оптимизацияВыражения и NULLJOIN и операции множествОсновы SQL-запросовСтроки и приведение типовПодзапросы и CTEОконные функции

Вопросы 610 из 20

6Колонка `created_at` имеет тип `timestamp`. Какой тип данных вернёт `DATE_TRUNC('day', created_at)`?
AТип `timestamp` (время будет `00:00:00` для выбранного дня).
BТип `date` (только календарная дата без времени).
CЦелое число — номер дня в месяце.
DСтроку в формате `YYYY-MM-DD`.
Ответ: `DATE_TRUNC` сохраняет тип `timestamp` и обнуляет более мелкие компоненты времени.

При входе типа `timestamp` результат `DATE_TRUNC('day', created_at)` тоже будет `timestamp`, просто с временем начала дня. Если нужен именно `date`, используйте приведение `created_at::date`.

7Колонка `created_at` типа `timestamp`. Какое утверждение про `created_at::date` и `DATE_TRUNC('day', created_at)` верно?
A`created_at::date` всегда возвращает `timestamp`, а `DATE_TRUNC('day', created_at)` — `date`.
B`DATE_TRUNC('day', created_at)` округляет время до ближайшего дня, а не обрезает.
C`created_at::date` возвращает тип `date`, а `DATE_TRUNC('day', created_at)` возвращает тип `timestamp` (с временем начала дня).
DОба выражения всегда возвращают одинаковый тип данных.
Ответ: Приведение `::date` меняет тип, а `DATE_TRUNC` сохраняет `timestamp` и обнуляет время ниже указанной гранулярности.

При `created_at::date` вы получаете календарную дату без времени. `DATE_TRUNC('day', created_at)` возвращает `timestamp` на `00:00:00` этого дня. Это влияет на формат результата и на дальнейшие вычисления/сравнения.

8Есть таблица `orders(created_at, amount)`, где `created_at` типа `timestamp`. Как посчитать выручку по месяцам?
A`SELECT DATE_TRUNC('month', created_at) AS m, amount FROM orders GROUP BY m;`
B`SELECT DATE_TRUNC('month', created_at) AS m, SUM(amount) FROM orders;`
C`SELECT DATE_TRUNC('month', created_at) AS m, SUM(amount) FROM orders GROUP BY DATE_TRUNC('month', created_at);`
D`SELECT DATE_TRUNC('day', created_at) AS m, SUM(amount) FROM orders GROUP BY DATE_TRUNC('month', created_at);`
Ответ: Для метрик по периодам вычислите бакет через `DATE_TRUNC` и агрегируйте с `GROUP BY` по этому бакету.

Чтобы получить выручку по месяцам, сформируйте месячный бакет `DATE_TRUNC('month', created_at)` и посчитайте `SUM(amount)`. В `GROUP BY` нужно повторить то же выражение, что используется для бакета.

9В таблице `events(created_at)` нужно выбрать события за последние 7 дней относительно текущего момента (`current_timestamp`). Какое условие в `WHERE` корректнее?
A`WHERE created_at >= current_timestamp - INTERVAL '7 days'`
B`WHERE created_at >= current_date - INTERVAL '7 days'`
C`WHERE DATE_TRUNC('day', created_at) >= current_timestamp - INTERVAL '7 days'`
D`WHERE created_at <= current_timestamp - INTERVAL '7 days'`
Ответ: Для скользящего окна используйте `current_timestamp` и вычитайте интервал через `INTERVAL`.

`current_date` обнуляет время до полуночи и подходит для календарных периодов. Для последних 7 дней относительно текущего момента используйте `created_at >= current_timestamp - INTERVAL '7 days'`.

10Для сравнения метрик по неделям нужно получить начало предыдущей недели. Какое выражение вернёт начало предыдущей недели относительно `current_date`?
A`DATE_TRUNC('week', current_date) - INTERVAL '1 week'`
B`DATE_TRUNC('week', current_date) - INTERVAL '1 day'`
C`DATE_TRUNC('month', current_date) - INTERVAL '1 week'`
D`current_date - INTERVAL '1 week'`
Ответ: Найдите начало текущей недели через `DATE_TRUNC`, затем сдвиньте на `INTERVAL '1 week'` назад.

Чтобы корректно сравнивать недели, важно фиксировать границы бакетов. `DATE_TRUNC('week', current_date)` даёт начало текущей недели, а `- INTERVAL '1 week'` — начало предыдущей.

1234

Хотите тренировать интерактивно?

В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.

Тренировать в Telegram

Другие темы: SQL

Агрегация, GROUP BY и HAVINGEXPLAIN и оптимизацияВыражения и NULLJOIN и операции множествОсновы SQL-запросовСтроки и приведение типовПодзапросы и CTEОконные функции