SELECT TO_CHAR(created_at, 'YYYY-MM') AS month,
COUNT(*) AS orders
FROM orders
GROUP BY 1
ORDER BY 1;
Результат:
month | orders --------+------- 2026-01 | 1240 2026-02 | 1388 2026-03 | 1502
SELECT id,
TO_CHAR(amount, 'FM9,999,990.00') AS amount_fmt
FROM payments
WHERE status = 'paid'
LIMIT 2;
Результат:
id | amount_fmt ----+----------- 101 | 12,500.00 102 | 1,990.00
SELECT TO_CHAR(created_at, 'DD.MM.YYYY HH24:MI') AS ts
FROM orders
ORDER BY created_at DESC
LIMIT 2;
Результат:
ts ----------------- 11.07.2026 14:32 11.07.2026 14:05Порешать SQL-задачи в тренажёре →
Спрашивают, когда речь о форматировании отчётов и группировке по периодам; в паре с DATE_TRUNC (усечение до месяца/недели) и EXTRACT (вытащить часть даты числом).
Нет. В SQLite для форматирования дат используют strftime('%Y-%m', col), а чисел — printf(). В MySQL для дат это DATE_FORMAT(col, '%Y-%m'), для чисел — FORMAT(). Переносить SQL с TO_CHAR между диалектами напрямую нельзя.
TO_CHAR возвращает текст, и он сортируется как строка, а не как дата. Формат '01.2026' встанет раньше '02.2025'. Решение — форматировать в 'YYYY-MM-DD' (лексикографический порядок совпадает с хронологическим) либо сортировать по исходному столбцу даты.
Добавьте префикс FM в начало шаблона, например TO_CHAR(amount, 'FM999990.00'). Без FM PostgreSQL резервирует место под максимальную ширину и выравнивает пробелами. FM (fill mode) выдаёт компактную строку без паддинга.
Работа с датами · Строковые функции
LAG · date_trunc · EXTRACT · SUBSTR · strftime · CONCAT
Открыть SQL-тренажёр (565 задач) →