
Работа с датами в SQL требует знания конкретных функций, доступных в используемой СУБД. Например, в MySQL для получения текущей даты используется функция CURRENT_DATE(), а в PostgreSQL – выражение CURRENT_DATE без скобок. В Oracle аналогичную задачу решает SYSDATE. Эти различия необходимо учитывать при написании универсальных запросов.
Для форматирования даты применяются специализированные функции. В MySQL – DATE_FORMAT(), где можно задать шаблон отображения, например: DATE_FORMAT(NOW(), ‘%d.%m.%Y’). В PostgreSQL используется TO_CHAR(), что позволяет вывести дату в нужном формате: TO_CHAR(NOW(), ‘DD.MM.YYYY’). Oracle также поддерживает TO_CHAR() с аналогичным синтаксисом.
При выборке данных часто требуется фильтрация по датам. В MySQL можно использовать конструкцию WHERE DATE(created_at) = ‘2025-10-04’, а в PostgreSQL – оператор приведения типа created_at::date. В Oracle – функция TRUNC(), отсекающая время: TRUNC(created_at) = DATE ‘2025-10-04’.
Знание синтаксических различий между СУБД позволяет избежать ошибок при миграции проектов и облегчает написание оптимизированных запросов. Правильное использование функций работы с датами гарантирует точность выборки и гибкость отображения результатов.
Использование функции CURRENT_DATE для получения текущей даты

Функция CURRENT_DATE возвращает системную дату без времени в формате, зависящем от СУБД. В PostgreSQL и MySQL это значение типа DATE, например 2025-10-04, в Oracle – аналогично DATE, но с обнулённым временем.
Пример в PostgreSQL и MySQL: SELECT CURRENT_DATE;. Результат – текущая календарная дата.
Для фильтрации данных по дате: SELECT * FROM orders WHERE order_date = CURRENT_DATE;. Такой запрос вернёт записи только за сегодняшний день.
При необходимости преобразования формата можно использовать функции TO_CHAR (PostgreSQL) или DATE_FORMAT (MySQL):
SELECT TO_CHAR(CURRENT_DATE, 'DD.MM.YYYY');
SELECT DATE_FORMAT(CURRENT_DATE, '%d.%m.%Y');
В отличие от NOW() или CURRENT_TIMESTAMP, функция CURRENT_DATE полностью отбрасывает время, что удобно при сравнении только по датам без учёта часов и минут.
Функция NOW() возвращает текущие дату и время в формате YYYY-MM-DD HH:MM:SS. Она используется в MySQL, PostgreSQL и большинстве SQL-диалектов для работы с системным временем сервера.
Пример запроса:
SELECT NOW();
Результат будет зависеть от настроек часового пояса. Например: 2025-10-04 15:27:42.
Функцию удобно применять для записи времени вставки данных:
INSERT INTO orders (user_id, created_at)
VALUES (5, NOW());
При выборке можно использовать форматирование:
SELECT DATE_FORMAT(NOW(), '%d.%m.%Y %H:%i');
Для сравнения дат NOW() работает как выражение времени:
SELECT * FROM sessions
WHERE expire_at > NOW();
Таким образом, NOW() подходит для вставки меток времени, фильтрации записей по актуальности и отображения текущей даты в удобном формате.
Форматирование даты с помощью функции DATE_FORMAT в MySQL

Функция DATE_FORMAT(date, format) преобразует дату в строку согласно заданному шаблону. Формат задаётся специальными спецификаторами, каждый из которых отвечает за определённый элемент даты или времени.
Наиболее используемые спецификаторы:
- %Y – полный год (например, 2025)
- %y – последние две цифры года (например, 25)
- %m – номер месяца с ведущим нулём (01–12)
- %c – номер месяца без ведущего нуля
- %M – полное название месяца (January, February…)
- %d – день месяца с ведущим нулём (01–31)
- %e – день месяца без ведущего нуля
- %H – час в 24-часовом формате (00–23)
- %i – минуты (00–59)
- %s – секунды (00–59)
Пример: получение даты в формате «день.месяц.год»:
SELECT DATE_FORMAT(NOW(), '%d.%m.%Y') AS formatted_date;
Результат: 04.10.2025
Для отображения даты с названием месяца:
SELECT DATE_FORMAT('2025-10-04', '%e %M %Y') AS formatted_date;
Результат: 4 October 2025
Функция полезна при подготовке отчетов и интерфейсов, где важно соответствие формата локальным требованиям. Внутри таблиц рекомендуется хранить дату в типах DATE или DATETIME, а форматирование выполнять только на этапе выборки.
Применение функции TO_CHAR для форматирования даты в PostgreSQL и Oracle

Примеры в PostgreSQL:
SELECT TO_CHAR(NOW(), 'DD.MM.YYYY');→ 04.10.2025SELECT TO_CHAR(NOW(), 'YYYY-MM-DD HH24:MI:SS');→ 2025-10-04 15:27:43SELECT TO_CHAR(NOW(), 'TMMonth DD, YYYY');→ Октябрь 04, 2025
Примеры в Oracle:
SELECT TO_CHAR(SYSDATE, 'DD.MM.YYYY') FROM dual;→ 04.10.2025SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM dual;→ 2025-10-04 15:27:43SELECT TO_CHAR(SYSDATE, 'Month DD, YYYY', 'NLS_DATE_LANGUAGE=RUSSIAN') FROM dual;→ Октябрь 04, 2025
Основные шаблоны:
YYYY– годMM– месяц (числом)Month/TMMonth– название месяца (в Oracle зависит отNLS_DATE_LANGUAGE)DD– день месяцаHH24– часы в 24-часовом форматеMI– минутыSS– секунды
Рекомендации:
- В PostgreSQL используйте
TMMonthдля локализованного названия месяца без лишних пробелов. - Для унификации форматов в отчетах предпочтительнее использовать ISO-формат
'YYYY-MM-DD'.
Извлечение частей даты с помощью функций YEAR, MONTH и DAY
Функции YEAR(), MONTH() и DAY() позволяют выделять конкретные элементы даты для дальнейшей обработки. Они удобны при фильтрации, группировке и форматировании результатов.
Пример извлечения года:
SELECT YEAR(дата_заказа) AS год FROM заказы;
Аналогично можно получить номер месяца:
SELECT MONTH(дата_заказа) AS месяц FROM заказы;
Для получения дня месяца используется:
SELECT DAY(дата_заказа) AS день FROM заказы;
Часто эти функции применяются в условиях отбора. Например, выбор заказов за июль 2024 года:
SELECT *
FROM заказы
WHERE YEAR(дата_заказа) = 2024
AND MONTH(дата_заказа) = 7;
Функции можно использовать и в группировке, например подсчет количества заказов по месяцам:
SELECT YEAR(дата_заказа) AS год, MONTH(дата_заказа) AS месяц, COUNT(*) AS количество
FROM заказы
GROUP BY YEAR(дата_заказа), MONTH(дата_заказа);
При больших объемах данных следует помнить, что применение функций к столбцу в WHERE может замедлять запрос, так как индексы не будут использоваться. В таких случаях лучше указывать диапазоны дат.
Сравнение дат в условиях WHERE

Для фильтрации записей по дате в SQL используют оператор WHERE с точными значениями, диапазонами или функциями даты. Например, чтобы выбрать все заказы, созданные 1 января 2025 года, применяют:
SELECT * FROM orders WHERE order_date = '2025-01-01';
Для диапазонов используют BETWEEN или комбинацию операторов >= и <=:
SELECT * FROM orders WHERE order_date BETWEEN '2025-01-01' AND '2025-01-31';
или
SELECT * FROM orders WHERE order_date >= '2025-01-01' AND order_date <= '2025-01-31';
Сравнение с текущей датой выполняется через встроенные функции. В MySQL используют CURDATE() или NOW():
SELECT * FROM orders WHERE order_date < CURDATE();
В PostgreSQL аналогично применяют CURRENT_DATE или CURRENT_TIMESTAMP:
SELECT * FROM orders WHERE order_date > CURRENT_DATE - INTERVAL '7 days';
Для частичных сравнений, например, всех записей за определенный месяц, используют функции извлечения части даты. В MySQL:
SELECT * FROM orders WHERE YEAR(order_date) = 2025 AND MONTH(order_date) = 1;
В PostgreSQL:
SELECT * FROM orders WHERE EXTRACT(YEAR FROM order_date) = 2025 AND EXTRACT(MONTH FROM order_date) = 1;
Важно учитывать формат хранения даты и тип поля. Для DATETIME сравнение с датой без времени может потребовать явного преобразования или использования диапазона. Например:
SELECT * FROM orders WHERE order_date >= '2025-01-01 00:00:00' AND order_date < '2025-01-02 00:00:00';
Использование индексов эффективно только при прямом сравнении или диапазоне без применения функций к столбцу. Применение функций к полю, например DATE(order_date) = '2025-01-01', может отключить индекс и замедлить запрос.
Преобразование строки в дату с помощью функции STR_TO_DATE
Функция STR_TO_DATE позволяет преобразовать строку в формат даты, соответствующий SQL. Она принимает два аргумента: исходную строку и формат, определяющий структуру даты.
Синтаксис:
STR_TO_DATE('строка_даты', 'формат')
Примеры форматов:
| Формат | Описание | Пример строки |
|---|---|---|
| %Y-%m-%d | Год-месяц-день | ‘2025-10-04’ |
| %d/%m/%Y | День/месяц/год | ’04/10/2025′ |
| %m-%d-%Y %H:%i:%s | Месяц-день-год часы:минуты:секунды | ’10-04-2025 14:30:00′ |
| %d-%b-%Y | День-аббревиатура месяца-год | ’04-Oct-2025′ |
Примеры использования:
SELECT STR_TO_DATE('04/10/2025', '%d/%m/%Y'); – результат 2025-10-04
SELECT STR_TO_DATE('10-04-2025 14:30:00', '%m-%d-%Y %H:%i:%s'); – результат 2025-10-04 14:30:00
Рекомендации:
- Совпадение формата с исходной строкой обязательно. Ошибка в одном символе приведет к
NULL. - Использовать двухсимвольные обозначения месяцев (%m) вместо текстовых (%b) повышает стабильность при парсинге.
- Встроенные функции
DATEиTIMEможно применять к результатуSTR_TO_DATEдля выделения даты или времени. - Для массовой обработки строковых дат рекомендуется применять
STR_TO_DATEв комбинации сUPDATEдля преобразования столбцов.
Вопрос-ответ:
Как в SQL вывести текущую дату?
В SQL для отображения текущей даты можно использовать встроенные функции. В большинстве баз данных, таких как MySQL или PostgreSQL, есть функция CURRENT_DATE, которая возвращает дату без времени. Если нужна дата и время, используют NOW() или CURRENT_TIMESTAMP. Например, запрос SELECT CURRENT_DATE; покажет только дату, а SELECT NOW(); — дату с временем.
Можно ли форматировать дату при выводе в SQL?
Да, SQL позволяет изменять формат даты при выводе. В MySQL для этого применяют функцию DATE_FORMAT, где можно задать шаблон, например SELECT DATE_FORMAT(NOW(), '%d.%m.%Y');, чтобы получить дату в виде «день.месяц.год». В PostgreSQL используют функцию TO_CHAR: SELECT TO_CHAR(NOW(), 'DD.MM.YYYY');. Это полезно, если нужно отобразить дату в определённом стиле для отчётов или интерфейсов.
Как вывести только год или месяц из даты в SQL?
Для получения отдельных частей даты используют функции YEAR(), MONTH() и DAY() в MySQL. Например, SELECT YEAR(NOW()); вернёт текущий год, а SELECT MONTH(NOW()); — номер месяца. В PostgreSQL применяют EXTRACT: SELECT EXTRACT(YEAR FROM NOW()); и SELECT EXTRACT(MONTH FROM NOW());. Это удобно, когда нужно группировать данные по году или месяцу или выполнять фильтрацию по отдельным компонентам даты.
Можно ли вывести дату в SQL в формате «понедельник, 1 января 2025»?
Да, это возможно, но способ зависит от СУБД. В PostgreSQL используют функцию TO_CHAR с шаблоном, включающим день недели: SELECT TO_CHAR(NOW(), 'FMDay, DD FMMonth YYYY');. Здесь FM убирает лишние пробелы, а Day и FMMonth отображают день недели и название месяца. В MySQL подобного формата нет напрямую, но можно составить строку с помощью CONCAT и функций DAYNAME(), MONTHNAME(), DAY() и YEAR(): SELECT CONCAT(DAYNAME(NOW()), ', ', DAY(NOW()), ' ', MONTHNAME(NOW()), ' ', YEAR(NOW()));. Такой подход позволяет выводить дату в более читабельном виде для пользователей.
