Форматирование дат: 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 есть два подхода:

  1. CONVERT — стандартный, но менее гибкий:
SELECT 
    CONVERT(VARCHAR, GETDATE(), 104) AS german_format  -- 104 = 'DD.MM.YYYY'
  1. 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-YYYYMM-DD-YYYY (американский формат).

3. Игнорирование локализации:

  • Месяц JANUARY vs ЯНВАРЬ.

Проверяйте документацию для своей СУБД!


Закрепляем на практике 💻

Попробуйте решить задачу:

-- Выведите текущую дату в формате: "Сегодня: пятница, 15 марта 2024 года"
-- Для вашей СУБД!

💡 Подсказка: Используйте комбинацию дня недели, месяца и года. В PostgreSQL это будет 'Сегодня: Day, DD Month YYYY года'.


И помните: красивое форматирование дат — это не только функциональность, но и UX. Ваши пользователи скажут вам спасибо! ✨

Скрыть рекламу навсегда

📘 VK Видео — обучение без ограничений

Все уроки доступны без VPN, без блокировок и зависаний.

Можно смотреть с телефона, планшета или компьютера — в любое время.

▶️ Смотреть на VK Видео