Форматирование дат: TO_CHAR, DATE_FORMAT и аналоги
Почему форматирование дат — это важно? ⏳
Работа с датами — одна из самых частых задач в SQL. Отчёты, аналитика, логирование — везде требуется красивый и читаемый формат дат. Но базы данных хранят даты в "сыром" виде (например, 2024-01-15), а нам нужен 15 января 2024 или 15.01.2024. Вот тут на помощь приходят функции форматирования!
TO_CHAR (Oracle, PostgreSQL) 🛠️
TO_CHAR — это "волшебная палочка" для преобразования дат в текст с нужным форматом.
-- Пример для Oracle/PostgreSQL
SELECT
TO_CHAR(SYSDATE, 'DD-MM-YYYY') AS date_simple,
TO_CHAR(SYSDATE, 'Day, Month DD, YYYY') AS date_pretty,
TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS datetime_full
FROM dual;
🔹 Разберём маски:
DD— день месяца (01-31)MM— месяц (01-12)YYYY— 4-значный годDay— название дня недели (например, "Monday")HH24— час в 24-часовом форматеMI— минуты (00-59)
DATE_FORMAT (MySQL) 🐬
В MySQL используется функция DATE_FORMAT, но логика похожа:
-- Пример для MySQL
SELECT
DATE_FORMAT(NOW(), '%d-%m-%Y') AS date_simple,
DATE_FORMAT(NOW(), '%W, %M %d, %Y') AS date_pretty,
DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS datetime_full;
🔹 Отличия в масках:
%dвместоDD%W— день недели (полное название)%H— час (24-часовой формат)%i— минуты (обратите внимание: неMI!)
CONVERT и FORMAT (SQL Server) ⚙️
В SQL Server есть два подхода:
CONVERT— стандартный, но менее гибкий:
SELECT
CONVERT(VARCHAR, GETDATE(), 104) AS german_format -- 104 = 'DD.MM.YYYY'
FORMAT(начиная с SQL Server 2012) — мощный и похож на C#:
SELECT
FORMAT(GETDATE(), 'dd.MM.yyyy') AS simple_date,
FORMAT(GETDATE(), 'dddd, MMMM dd, yyyy') AS long_date
💡 FORMAT поддерживает те же шаблоны, что и .NET, что делает его очень удобным для сложных форматов.
Практические примеры из реальной жизни 🏗️
Пример 1: Генерация отчёта с читаемыми датами
-- PostgreSQL
SELECT
user_id,
TO_CHAR(registration_date, 'DD.MM.YYYY') AS reg_date,
TO_CHAR(last_login, 'HH24:MI, DD Mon YYYY') AS last_login_pretty
FROM users;
Пример 2: Фильтрация по формату даты (MySQL)
-- Поиск заказов за январь 2024
SELECT order_id, DATE_FORMAT(order_date, '%M %Y') AS month_year
FROM orders
WHERE DATE_FORMAT(order_date, '%Y-%m') = '2024-01';
Продвинутые трюки 🎩
1. Локализация (PostgreSQL):
SET lc_time = 'ru_RU';
SELECT TO_CHAR(NOW(), 'Day, Month DD'); -- Выведет "понедельник, января 15"
2. Динамический формат (SQL Server):
DECLARE @format VARCHAR(20) = 'yyyy-MM-dd';
SELECT FORMAT(GETDATE(), @format);
3. Извлечение частей даты (все СУБД):
-- Вместо форматирования можно использовать EXTRACT/YEAR/MONTH/DAY
SELECT EXTRACT(YEAR FROM NOW()); -- Вернёт 2024
Что выбрать? Сравнение производительности ⚡
TO_CHAR/DATE_FORMAT— оптимальны для большинства задач.FORMAT(SQL Server) — удобен, но может быть медленнее на больших данных.CONVERT— самый быстрый, но менее гибкий.
📌 Совет: Для массовой обработки (миллионы строк) используйте простые форматы или извлечение компонентов даты (YEAR/MONTH/DAY).
Частые ошибки и как их избежать 🚨
1. Путаница в регистре:
MI— минуты в Oracle,mi— в MySQL.MM— месяц,mm— минуты в некоторых СУБД.
2. Неправильный порядок элементов:
DD-MM-YYYY≠MM-DD-YYYY(американский формат).
3. Игнорирование локализации:
- Месяц
JANUARYvsЯНВАРЬ.
✅ Проверяйте документацию для своей СУБД!
Закрепляем на практике 💻
Попробуйте решить задачу:
-- Выведите текущую дату в формате: "Сегодня: пятница, 15 марта 2024 года"
-- Для вашей СУБД!
💡 Подсказка: Используйте комбинацию дня недели, месяца и года. В PostgreSQL это будет 'Сегодня: Day, DD Month YYYY года'.
И помните: красивое форматирование дат — это не только функциональность, но и UX. Ваши пользователи скажут вам спасибо! ✨