Функция strftime() в SQLite: форматирование дат и группировка

strftime(формат, дата) — функция SQLite для форматирования даты по строке-шаблону: %Y — год, %m — месяц, %d — день, %w — день недели, %H — час. В SQLite нет date_trunc и EXTRACT, поэтому strftime заменяет обе: strftime('%Y-%m', d) группирует по месяцам, а strftime('%w', d) достаёт день недели.

Синтаксис

strftime('%Y-%m-%d %H:%M', дата) — коды: %Y %m %d %w %H %j

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

Пример 1: Выручка по месяцам (аналог date_trunc)

SELECT strftime('%Y-%m', created_at) AS month,
       SUM(amount) AS revenue
FROM orders
GROUP BY month
ORDER BY month;

Результат:

month   | revenue
2026-01 | 45000
2026-02 | 52000

Пример 2: Заказы по дням недели (0 = воскресенье)

SELECT strftime('%w', created_at) AS weekday,
       COUNT(*) AS orders
FROM orders
GROUP BY weekday;

Результат:

weekday | orders
0       | 210
1       | 340
Порешать SQL-задачи в тренажёре →

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

strftime всегда возвращает строку, а не число: strftime('%m', d) даёт '03', а не 3 — при сортировке или сравнении с числом приводи через CAST. День недели %w нумерует с воскресенья = 0 (как EXTRACT(DOW) в PostgreSQL, но не как ISO). И strftime работает только с датами в формате ISO (YYYY-MM-DD) — на «01.03.2026» вернёт NULL.

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

strftime — рабочая лошадка дат в SQLite и в этом тренажёре. Задачи «выручка по месяцам», «активность по дням недели», «когорты по неделям» на SQLite решаются через strftime, а на PostgreSQL — через date_trunc/EXTRACT.

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

Как сгруппировать по месяцам в SQLite?

strftime('%Y-%m', дата) вернёт строку вида «2026-01», по которой и группируй через GROUP BY. Это SQLite-аналог date_trunc('month', …) из PostgreSQL.

Как получить день недели в SQLite?

strftime('%w', дата) вернёт '0'..'6', где 0 это воскресенье. Результат строковый, для арифметики приводи через CAST(… AS INTEGER).

Почему strftime возвращает NULL?

Скорее всего дата не в формате ISO (YYYY-MM-DD). SQLite понимает только этот формат; строки вроде «01.03.2026» дадут NULL — сначала приведи их к ISO.

Задачи в тренажёре по теме

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

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

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

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

LAG · date_trunc · EXTRACT · TO_CHAR · AGE · CURRENT_DATE

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