
Работа с датами в SQL требует точного контроля формата для корректной фильтрации, сортировки и объединения данных. В базах данных MySQL, PostgreSQL и SQL Server используются разные функции для преобразования даты в нужный формат.
В PostgreSQL основным инструментом является функция TO_CHAR() для преобразования даты в текст и TO_DATE() для создания даты из строки. Пример: `TO_CHAR(order_date, ‘DD.MM.YYYY’)` возвращает `05.10.2025`. Для обратной операции `TO_DATE(‘05.10.2025’, ‘DD.MM.YYYY’)` вернёт объект даты.
SQL Server использует функции CONVERT() и FORMAT(). CONVERT(varchar, order_date, 104) выдаёт дату в формате `DD.MM.YYYY`, а FORMAT(order_date, ‘dd-MM-yyyy’) позволяет формировать пользовательский формат с учетом региональных настроек.
Изменение формата даты в SQL: примеры и инструкции

В SQL формат даты часто требуется изменить для корректного отображения или обработки данных. Основные функции зависят от используемой СУБД.
MySQL: Для преобразования даты используется функция DATE_FORMAT(). Пример:
SELECT DATE_FORMAT('2025-10-05', '%d.%m.%Y');
Результат: 05.10.2025. Формат %d – день, %m – месяц, %Y – год.
Для обратного преобразования строки в дату используется STR_TO_DATE():
SELECT STR_TO_DATE('05-10-2025', '%d-%m-%Y');
Результат: 2025-10-05 в формате DATE.
SQL Server: Функция FORMAT() позволяет изменять формат даты:
SELECT FORMAT(GETDATE(), 'dd.MM.yyyy');
Возвращает текущую дату в виде 05.10.2025. Для конвертации строки в дату используется CONVERT():
SELECT CONVERT(DATE, '05-10-2025', 105);
Код 105 задаёт формат dd-mm-yyyy.
PostgreSQL: Используется функция TO_CHAR() для форматирования даты:
SELECT TO_CHAR(CURRENT_DATE, 'DD.MM.YYYY');
Результат: 05.10.2025. Для преобразования строки в дату применяется TO_DATE():
SELECT TO_DATE('05-10-2025', 'DD-MM-YYYY');
Рекомендуется использовать встроенные функции СУБД для конвертации, чтобы избежать ошибок при разных локализациях и форматах.
Форматирование даты в MySQL с помощью DATE_FORMAT

SELECT DATE_FORMAT(‘2025-10-05’, ‘%d.%m.%Y’); вернёт 05.10.2025.
Основные спецификаторы формата:
- %Y – полный год, например 2025
- %y – двухзначный год, 25
- %m – месяц с ведущим нулём, 01–12
- %c – месяц без ведущего нуля, 1–12
- %d – день месяца с нулём, 01–31
- %e – день месяца без нуля, 1–31
- %H – час в 24-часовом формате, 00–23
- %h или %I – час в 12-часовом формате, 01–12
- %i – минуты, 00–59
- %s – секунды, 00–59
- %W – день недели полное название, например Monday
- %a – день недели коротко, Mon
Примеры использования:
SELECT DATE_FORMAT(order_date, ‘Заказ от %W, %d %M %Y’); – формирует строки типа Заказ от Sunday, 05 October 2025.
Для сортировки и фильтрации лучше хранить даты в стандартном формате YYYY-MM-DD и применять DATE_FORMAT только при отображении. Это сохраняет эффективность индексов и корректность вычислений.
DATE_FORMAT можно сочетать с CONCAT для объединения даты с другими строковыми значениями, например: SELECT CONCAT(‘Дата заказа: ‘, DATE_FORMAT(order_date, ‘%d.%m.%Y’)) – результат Дата заказа: 05.10.2025.
Преобразование строк в дату в PostgreSQL через TO_DATE
Функция TO_DATE преобразует строковое значение в тип DATE на основе указанного формата. Синтаксис: TO_DATE('строка', 'формат'). Например, для строки ‘2025-10-05’ с форматом ‘YYYY-MM-DD’ используется запрос:
SELECT TO_DATE('2025-10-05', 'YYYY-MM-DD');
Функция поддерживает различные элементы формата: YYYY – год, MM – месяц, DD – день, HH24 и MI – часы и минуты при работе с TIMESTAMP. Пример для строки ’05/10/2025′:
SELECT TO_DATE('05/10/2025', 'DD/MM/YYYY');
Для данных в формате ‘октябрь 5, 2025’ используется текстовое представление месяца: TO_DATE('октябрь 5, 2025', 'TMMonth DD, YYYY');. Функция TMMonth учитывает локализацию.
При преобразовании строк, содержащих неверные даты, PostgreSQL выдаёт ошибку. Для безопасной обработки можно использовать NULLIF или проверку формата через регулярные выражения перед вызовом TO_DATE.
Если необходимо преобразовать столбец с текстовыми датами, запрос имеет вид:
UPDATE table_name SET date_column = TO_DATE(text_column, 'DD.MM.YYYY');
Использование TO_DATE обеспечивает единообразие формата даты в базе и упрощает последующую фильтрацию и сортировку данных по дате.
Использование CONVERT для изменения формата даты в SQL Server
Функция CONVERT позволяет изменять представление даты и времени в SQL Server, преобразуя значения типа datetime или smalldatetime в строки определённого формата.
Синтаксис функции:
CONVERT(тип_данных, выражение_даты, стиль)
- тип_данных – обычно
VARCHAR(n)илиCHAR(n), гдеnсоответствует длине строки. - выражение_даты – столбец с типом даты или выражение, возвращающее дату.
- стиль – числовой код, определяющий формат даты.
Примеры часто используемых стилей:
101–mm/dd/yyyy103–dd/mm/yyyy120–yyyy-mm-dd hh:mi:ss126–yyyy-mm-ddThh:mi:ss(ISO 8601)
Примеры использования:
- Преобразование текущей даты в формат
dd/mm/yyyy:
SELECT CONVERT(VARCHAR(10), GETDATE(), 103) AS FormattedDate;
- Отображение даты и времени в формате
yyyy-mm-dd hh:mi:ss:
SELECT CONVERT(VARCHAR(19), GETDATE(), 120) AS DateTimeFormat;
- Использование CONVERT при работе с таблицей:
SELECT OrderID, CONVERT(VARCHAR(10), OrderDate, 101) AS OrderDateFormatted FROM Orders;
Рекомендации:
- Выбирайте
VARCHARдостаточной длины, чтобы полностью вместить формат даты. - Для обмена данными с другими системами предпочтительны стандарты ISO (стиль
126). - Старайтесь использовать
CONVERTв SELECT, а не при хранении в базе, чтобы не терять типdatetime.
Сравнение форматов даты при фильтрации данных в запросах
При фильтрации данных в SQL формат даты напрямую влияет на точность и производительность запросов. Использование разных форматов может приводить к неожиданным результатам или ошибкам преобразования.
Основные форматы даты, с которыми работают SQL-серверы:
- YYYY-MM-DD – стандарт ISO 8601, рекомендуется для сравнения и сортировки, так как сохраняет хронологический порядок при строковом сравнении.
- DD.MM.YYYY – часто используется в отчетности, требует явного преобразования при фильтрации в SQL через функции
STR_TO_DATEилиCONVERT. - MM/DD/YYYY – американский формат, при работе с международными системами требует проверки локали, иначе возможны ошибки интерпретации месяца и дня.
Примеры фильтрации по дате:
- Фильтрация по ISO 8601 (MySQL, PostgreSQL):
SELECT * FROM orders WHERE order_date > '2025-01-01';Нет необходимости в преобразовании, высокая скорость выполнения.
- Фильтрация при формате DD.MM.YYYY:
SELECT * FROM orders WHERE STR_TO_DATE(order_date, '%d.%m.%Y') > '2025-01-01';Необходимо преобразование строки в дату, что замедляет запрос на больших объемах данных.
- Фильтрация с использованием функций преобразования (SQL Server):
SELECT * FROM orders WHERE CONVERT(date, order_date, 104) > '2025-01-01';Формат 104 соответствует DD.MM.YYYY, позволяет корректно сравнивать даты.
Рекомендации при работе с фильтрацией по дате:
- Хранить даты в формате DATE или DATETIME, избегать строковых форматов.
- Использовать ISO 8601 для фильтрации без преобразований.
- Если данные приходят в локальных форматах, выполнять конвертацию только при выборке, а не при хранении.
- Проверять локаль и настройки сервера при работе с нестандартными форматами.
ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YYYY';
SELECT SYSDATE FROM dual;
выведет текущую дату в формате `05.10.2025`.
Для постоянного изменения формата даты в базе можно задать `NLS_DATE_FORMAT` на уровне профиля пользователя через `ALTER USER`:
ALTER USER username SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
SELECT TO_CHAR(hire_date, 'DD-Mon-YYYY') FROM employees;
При работе с временными метками применяется `TO_CHAR` с типом `TIMESTAMP`:
SELECT TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF') FROM dual;
Для сценариев отчетности рекомендуется создавать представления (VIEW) с заранее определенным форматом даты, чтобы все пользователи видели данные в едином виде, не меняя настройки сессии.
Изменение `NLS_DATE_FORMAT` через сессию влияет только на текущую подключение, что удобно для тестирования или временных запросов. Для скриптов автоматической генерации отчетов предпочтительно использовать `TO_CHAR` с конкретным форматом, чтобы исключить зависимость от глобальных настроек базы.
Обработка временных зон и локализации при форматировании даты

При работе с датами в SQL важно учитывать временные зоны, так как одна и та же метка времени может отображаться по-разному в разных регионах. В PostgreSQL для преобразования времени используется функция AT TIME ZONE. Например:
SELECT created_at AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Moscow' FROM orders;
Этот запрос переводит значение из UTC в московское время, корректно учитывая смещение. В MySQL применяют функцию CONVERT_TZ:
SELECT CONVERT_TZ(order_date, 'UTC', 'Asia/Tokyo') FROM orders;
Для локализации формата даты в PostgreSQL используется функция TO_CHAR с шаблонами. Например:
SELECT TO_CHAR(NOW() AT TIME ZONE 'Europe/Berlin', 'DD Month YYYY HH24:MI') AS formatted_date;
Для MySQL можно задать локаль с помощью lc_time_names:
SET lc_time_names = 'fr_FR';
SELECT DATE_FORMAT(NOW(), '%W %d %M %Y');
Таблица основных рекомендаций по работе с временными зонами и локализацией:
| СУБД | Функция/Команда | Назначение | Пример |
|---|---|---|---|
| PostgreSQL | AT TIME ZONE | Преобразование между временными зонами | created_at AT TIME ZONE ‘UTC’ AT TIME ZONE ‘Europe/Moscow’ |
| PostgreSQL | TO_CHAR | Форматирование даты с учетом локализации | TO_CHAR(NOW() AT TIME ZONE ‘Europe/Berlin’, ‘DD Month YYYY HH24:MI’) |
| MySQL | CONVERT_TZ | Преобразование между временными зонами | CONVERT_TZ(order_date, ‘UTC’, ‘Asia/Tokyo’) |
| MySQL | lc_time_names + DATE_FORMAT | Локализация названий месяцев и дней | SET lc_time_names = ‘fr_FR’; SELECT DATE_FORMAT(NOW(), ‘%W %d %M %Y’); |
Вопрос-ответ:
Как в SQL преобразовать дату из формата YYYY-MM-DD в DD.MM.YYYY?
В SQL для изменения формата даты можно использовать функцию FORMAT (в SQL Server) или TO_CHAR (в Oracle и PostgreSQL). Например, в SQL Server: SELECT FORMAT(GETDATE(), 'dd.MM.yyyy'); вернёт текущую дату в виде «05.10.2025». В PostgreSQL аналогично: SELECT TO_CHAR(CURRENT_DATE, 'DD.MM.YYYY');. Эти функции позволяют управлять выводом даты в удобном виде для отображения или отчётов.
Можно ли изменить формат даты при сохранении её в таблице?
Формат даты в базе данных напрямую не сохраняется, так как тип DATE хранит значение даты независимо от отображения. Формат применяется только при выводе или преобразовании в строку. Для изменения отображения при выборке используется TO_CHAR или FORMAT, а при вставке можно использовать строковое представление даты в формате, поддерживаемом СУБД, например ‘YYYY-MM-DD’.
Какая функция используется в MySQL для изменения формата даты?
В MySQL применяется функция DATE_FORMAT. Она позволяет преобразовать дату в строку с указанным форматом. Например: SELECT DATE_FORMAT(NOW(), '%d.%m.%Y'); вернёт текущую дату в виде «05.10.2025». С помощью специальных символов, таких как %d, %m, %Y, можно получать дни, месяцы и годы в нужном виде.
Как работать с временными метками и изменять их формат в SQL?
Для работы с временными метками (timestamp) используется та же логика, что и с датами. В PostgreSQL можно применять TO_CHAR(timestamp, 'DD.MM.YYYY HH24:MI:SS'), чтобы получить дату и время в читаемом виде. В SQL Server функция FORMAT также поддерживает время: SELECT FORMAT(GETDATE(), 'dd.MM.yyyy HH:mm:ss');. Это удобно для логов, отчётов или отображения даты и времени пользователю.
Можно ли автоматически менять формат даты в выборках без использования функций для каждой колонки?
Прямого способа изменить формат всех дат без использования функций при выборке нет. Однако можно создать представление (VIEW) с заранее заданным форматом даты. Например, в PostgreSQL: CREATE VIEW formatted_dates AS SELECT TO_CHAR(order_date, 'DD.MM.YYYY') AS order_date FROM orders;. После этого выборка из представления вернёт даты уже в нужном виде.
