
В SQL дата хранится в типах DATE, DATETIME, TIMESTAMP и TIME, каждый из которых имеет специфический формат и область применения. Тип DATE хранит только календарную дату в формате ‘YYYY-MM-DD’, DATETIME объединяет дату и время ‘YYYY-MM-DD HH:MI:SS’, а TIMESTAMP дополнительно учитывает временную зону и автоматически обновляется при изменении записи.
Для корректного сравнения и фильтрации дат SQL требует строго соблюдения формата. Например, запрос SELECT * FROM orders WHERE order_date = ‘2025-10-04’; вернет все заказы с точной датой 4 октября 2025 года. Использование неверного формата, например ’04-10-2025′, вызовет ошибку или некорректные результаты в большинстве СУБД.
При преобразовании строк в дату применяют функции STR_TO_DATE() в MySQL или TO_DATE() в Oracle. Например, STR_TO_DATE(’04/10/2025′, ‘%d/%m/%Y’) конвертирует строку в тип DATE, что позволяет выполнять арифметику с датами и группировку по дням, месяцам или годам.
Форматы даты также критичны для агрегатных функций. Использование YEAR(order_date) или MONTH(order_date) позволяет строить отчеты без изменения исходного формата хранения, а функции DATEDIFF() и TIMESTAMPDIFF() обеспечивают точное вычисление интервалов между датами для анализа времени выполнения процессов.
Стандартные типы данных для даты в SQL

SQL предоставляет несколько ключевых типов данных для работы с датами и временем. Выбор зависит от точности, объема хранимой информации и требований к операциям с датой.
- DATE – хранит только календарную дату в формате
YYYY-MM-DD. Подходит для хранения дней рождения, дат заказов или событий без привязки ко времени. Пример использования:CREATE TABLE events ( event_id INT PRIMARY KEY, event_date DATE ); - TIME – хранит время суток без даты, обычно в формате
HH:MI:SS. Используется для отметки времени событий или расписаний:CREATE TABLE schedule ( task_id INT PRIMARY KEY, start_time TIME ); - DATETIME – комбинирует дату и время в формате
YYYY-MM-DD HH:MI:SS. Рекомендуется для логов, транзакций, когда важны оба параметра:CREATE TABLE transactions ( trans_id INT PRIMARY KEY, trans_timestamp DATETIME ); - TIMESTAMP – похож на DATETIME, но автоматически фиксирует момент вставки или обновления записи. Полезен для аудита и отслеживания изменений:
CREATE TABLE audit_log ( log_id INT PRIMARY KEY, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); - YEAR – хранит только год (2- или 4-значный). Используется для статистики по годам или агрегаций:
CREATE TABLE yearly_report ( report_id INT PRIMARY KEY, report_year YEAR );
Рекомендации по выбору типа:
- Если нужна только дата без времени – используйте DATE.
- Для хранения времени дня без даты – TIME.
- Для полной отметки времени события – DATETIME или TIMESTAMP, при необходимости автоматической отметки изменений – TIMESTAMP.
- Для анализа по годам – YEAR.
Форматирование даты с помощью функции DATE_FORMAT

Функция DATE_FORMAT в SQL позволяет преобразовать значения типа DATE и DATETIME в строки с заданным форматом. Синтаксис: DATE_FORMAT(дата, 'формат'). Формат задается комбинацией специальных символов, каждый из которых соответствует компоненту даты или времени.
Основные символы формата:
- %Y – год в 4 цифры (например, 2025)
- %y – год в 2 цифры (например, 25)
- %m – месяц с ведущим нулем (01–12)
- %c – месяц без ведущего нуля (1–12)
- %d – день месяца с ведущим нулем (01–31)
- %e – день месяца без ведущего нуля (1–31)
- %H – часы в 24-часовом формате (00–23)
- %h – часы в 12-часовом формате (01–12)
- %i – минуты (00–59)
- %s – секунды (00–59)
- %p – AM/PM
Примеры практического использования:
1. Преобразование даты в формат ДД.ММ.ГГГГ:
SELECT DATE_FORMAT('2025-10-04', '%d.%m.%Y'); -- Результат: 04.10.2025
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); -- Например: 2025-10-04 14:35:12
3. Форматирование для отображения месяца текстом и дня недели:
SELECT DATE_FORMAT('2025-10-04', '%W, %M %e, %Y'); -- Результат: Saturday, October 4, 2025
4. Использование 12-часового формата с AM/PM:
SELECT DATE_FORMAT('2025-10-04 18:45:00', '%h:%i %p'); -- Результат: 06:45 PM
Рекомендации при работе с DATE_FORMAT:
- Всегда проверяйте корректность используемых символов формата для конкретной версии SQL.
- Для сортировки и сравнения лучше хранить даты в типах DATE или DATETIME, а форматирование применять только для отображения.
- Сочетание текстовых строк и формата даты позволяет строить отчеты с понятной визуализацией.
Преобразование строк в дату через STR_TO_DATE

Функция STR_TO_DATE используется для конвертации строкового значения в тип DATE или DATETIME в MySQL. Она принимает два аргумента: исходную строку и формат, описывающий структуру даты в строке.
Синтаксис:
STR_TO_DATE('строка', 'формат')
Примеры форматов:
%Y– год в 4 цифры (например, 2025)%y– год в 2 цифры (например, 25)%m– месяц с ведущим нулем (01–12)%d– день месяца с ведущим нулем (01–31)%H– часы 00–23%i– минуты 00–59%s– секунды 00–59
Примеры использования:
- Конвертация даты в формате
дд/мм/ггггв типDATE: - Преобразование строки с временем
гггг-мм-дд чч:мм:ссвDATETIME: - Обработка нестандартного формата с текстовыми разделителями:
SELECT STR_TO_DATE('04/10/2025', '%d/%m/%Y');
SELECT STR_TO_DATE('2025-10-04 15:30:00', '%Y-%m-%d %H:%i:%s');
SELECT STR_TO_DATE('04 октября 2025', '%d %M %Y');
Рекомендации при использовании:
- Формат в
STR_TO_DATEдолжен строго соответствовать исходной строке. - Используйте
%Mили%bдля текстового представления месяца на языке, установленном в MySQL. - Для временных меток с миллисекундами используйте
%fдля микросекунд. - Если строка не соответствует формату, функция возвращает
NULL.
Комбинируя различные спецификаторы, можно корректно обрабатывать большинство форматов даты и времени, включая пользовательские строки с нестандартными разделителями или текстовыми месяцами.
Использование ISO 8601 для хранения даты и времени
Формат ISO 8601 обеспечивает единый стандарт представления даты и времени, минимизируя ошибки при хранении и передаче данных между системами. Для даты используется структура YYYY-MM-DD, например, 2025-10-04. Для времени применяется формат HH:MM:SS с возможностью указания долей секунды: 14:30:15.123. Полная дата-время записывается как YYYY-MM-DDTHH:MM:SS, например, 2025-10-04T14:30:15. Символ T разделяет дату и время, что соответствует стандарту ISO 8601.
Для хранения в SQL рекомендуется использовать типы DATE для даты, TIME для времени и DATETIME или TIMESTAMP для даты и времени одновременно. Вставка данных в этих типах с использованием ISO 8601 обеспечивает корректную сортировку, фильтрацию и агрегирование. Пример вставки: INSERT INTO events (event_date) VALUES ('2025-10-04T14:30:15');.
ISO 8601 также поддерживает указание часового пояса через смещение UTC, например, 2025-10-04T14:30:15+03:00. Это важно для приложений, работающих с международными пользователями, так как SQL-серверы корректно интерпретируют временные зоны при преобразовании в локальное время. В PostgreSQL и MySQL рекомендуется использовать тип TIMESTAMP WITH TIME ZONE для хранения таких значений.
Для автоматизации работы с датой и временем в ISO 8601 можно использовать функции SQL: NOW() возвращает текущую дату и время в формате ISO 8601, а DATE_FORMAT в MySQL или TO_CHAR в PostgreSQL позволяют форматировать дату для отображения или логики приложения.
Хранение даты и времени в ISO 8601 обеспечивает совместимость между различными базами данных и приложениями, упрощает интеграцию и уменьшает вероятность ошибок при интерпретации временных данных.
Сравнение дат и фильтрация записей по дате

Для сравнения дат в SQL используют операторы =, <, <=, >, >=, BETWEEN. Например, чтобы выбрать записи с конкретной датой, применяют:
SELECT * FROM orders WHERE order_date = '2025-10-01';
Для диапазонов дат используют BETWEEN или логическое объединение AND:
SELECT * FROM orders WHERE order_date BETWEEN '2025-01-01' AND '2025-03-31';
или
SELECT * FROM orders WHERE order_date >= '2025-01-01' AND order_date <= '2025-03-31';
Функции DATE(), YEAR(), MONTH(), DAY() помогают фильтровать записи по компонентам даты. Пример: выбор всех заказов за октябрь 2025 года:
SELECT * FROM orders WHERE YEAR(order_date) = 2025 AND MONTH(order_date) = 10;
Для работы с временными метками используют TIMESTAMP и функцию CAST. Например, фильтрация заказов после определённого времени:
SELECT * FROM orders WHERE order_date >= CAST('2025-10-01 12:00:00' AS DATETIME);
При сравнении дат важно учитывать формат хранения. В MySQL стандарт ISO 8601 'YYYY-MM-DD' обеспечивает корректное сравнение. В PostgreSQL и SQL Server также рекомендуется использовать DATE или TIMESTAMP для точной фильтрации.
Для ускорения фильтрации больших таблиц создают индексы по столбцам с датой:
CREATE INDEX idx_order_date ON orders(order_date);
Это снижает время выполнения запросов с условиями WHERE order_date >= ... или BETWEEN.
Добавление и вычитание интервалов к дате

В SQL для изменения даты на заданный интервал используют функции DATEADD (MS SQL), ADDDATE и DATE_ADD (MySQL), а также арифметические операции с типом INTERVAL в PostgreSQL. Интервалы могут задаваться в днях, месяцах, годах, часах, минутах и секундах.
Примеры для различных СУБД:
| СУБД | Добавление интервала | Вычитание интервала |
|---|---|---|
| MS SQL | SELECT DATEADD(day, 10, '2025-10-04'); – прибавить 10 дней |
SELECT DATEADD(month, -2, '2025-10-04'); – вычесть 2 месяца |
| MySQL | SELECT DATE_ADD('2025-10-04', INTERVAL 15 DAY); |
SELECT DATE_SUB('2025-10-04', INTERVAL 1 YEAR); |
| PostgreSQL | SELECT '2025-10-04'::date + INTERVAL '7 days'; |
SELECT '2025-10-04'::date - INTERVAL '3 months'; |
Для сложных вычислений с датой рекомендуется использовать явное указание единицы интервала, чтобы избежать ошибок при переходе через месяцы с разной длиной и високосные годы. Например, добавление одного месяца к дате '2025-01-31' в PostgreSQL корректно вернёт '2025-02-28', а простое сложение чисел может дать некорректный результат.
При работе с временем допускается комбинировать несколько интервалов: DATEADD(day, 2, DATEADD(hour, 5, '2025-10-04 10:00:00')) в MS SQL увеличивает дату на 2 дня и 5 часов одновременно.
Для вычислений между датами удобно использовать функцию DATEDIFF (MS SQL, MySQL) или оператор - в PostgreSQL, чтобы точно определить разницу и корректно применять интервалы при планировании сроков.
Работа с временными зонами и формат UTC

В SQL хранение даты и времени с учетом временных зон осуществляется с помощью типов TIMESTAMP WITH TIME ZONE или DATETIMEOFFSET в зависимости от СУБД. Формат UTC (Coordinated Universal Time) обеспечивает единый стандарт для обмена данными между разными часовыми поясами.
Для преобразования локального времени в UTC в PostgreSQL используется функция AT TIME ZONE:
SELECT '2025-10-04 15:00:00'::timestamp AT TIME ZONE 'Europe/Moscow' AT TIME ZONE 'UTC';
Результат будет 2025-10-04 12:00:00+00, что соответствует времени в UTC.
В MySQL для работы с временными зонами применяются функции CONVERT_TZ:
SELECT CONVERT_TZ('2025-10-04 15:00:00', 'Europe/Moscow', '+00:00');
Это позволяет сохранять универсальное время в базе и корректно отображать его пользователям в разных зонах.
При хранении временных отметок рекомендуется использовать UTC, а отображение в локальном времени выполнять на уровне приложения. Это исключает ошибки при переходе на летнее/зимнее время и упрощает агрегацию данных по времени.
Для автоматического контроля временной зоны можно использовать системные переменные СУБД, например в MySQL:
SET time_zone = '+00:00';
В PostgreSQL настройка параметра timezone через SET TIME ZONE 'UTC'; гарантирует консистентность данных при выполнении запросов с функциями даты и времени.
Практические примеры вставки и обновления дат
Для вставки даты в таблицу используется стандартный формат `YYYY-MM-DD`. Например, для таблицы `orders` с колонкой `order_date`:
INSERT INTO orders (order_id, customer_id, order_date) VALUES (101, 5, '2025-10-04');
Если требуется вставить дату с временем, используется формат `YYYY-MM-DD HH:MI:SS`:
INSERT INTO orders (order_id, customer_id, order_date) VALUES (102, 7, '2025-10-04 14:30:00');
Для обновления существующей даты применяется команда `UPDATE`. Пример изменения даты заказа для конкретного `order_id`:
UPDATE orders SET order_date = '2025-10-10' WHERE order_id = 101;
Если нужно изменить только время в дате с сохранением даты, можно использовать функцию `CONCAT` или типовые функции работы с датой:
UPDATE orders SET order_date = CONCAT(DATE(order_date), ' 16:00:00') WHERE order_id = 102;
Для баз с поддержкой `TIMESTAMP` удобно использовать `CURRENT_TIMESTAMP` для автоматического заполнения текущей даты и времени:
INSERT INTO orders (order_id, customer_id, order_date) VALUES (103, 9, CURRENT_TIMESTAMP);
При обновлении на текущий момент времени применяется:
UPDATE orders SET order_date = CURRENT_TIMESTAMP WHERE order_id = 103;
Для массового сдвига дат можно использовать арифметику дат, например, добавление 7 дней к существующей дате:
UPDATE orders SET order_date = DATE_ADD(order_date, INTERVAL 7 DAY) WHERE customer_id = 5;
Вопрос-ответ:
Какие основные форматы даты поддерживаются в SQL и чем они отличаются?
В SQL чаще всего используются форматы DATE, DATETIME и TIMESTAMP. DATE хранит только календарную дату (год, месяц, день), без времени. DATETIME включает дату и время с точностью до секунд. TIMESTAMP похож на DATETIME, но часто используется для хранения метки времени с учётом часового пояса и может автоматически обновляться при изменении записи. Выбор формата зависит от того, нужно ли фиксировать время события или только дату.
Как правильно записать дату в запросе SQL, чтобы избежать ошибок при вставке данных?
При вставке значений в поля типа DATE или DATETIME важно использовать стандартный формат ‘YYYY-MM-DD’ для даты и ‘YYYY-MM-DD HH:MM:SS’ для даты с временем. Например, INSERT INTO events (event_date) VALUES (‘2025-10-04’);. Если указать дату в нестандартном формате, сервер может выдать ошибку или преобразовать её некорректно. Также можно использовать функции SQL, такие как STR_TO_DATE, чтобы конвертировать строки с другими форматами в нужный тип.
Можно ли сравнивать даты в разных форматах в SQL и как это делается?
Да, сравнение возможно, но формат хранения должен быть согласован. Если обе даты имеют тип DATE или DATETIME, достаточно использовать операторы =, <, >, <=, >=. Например, SELECT * FROM orders WHERE order_date > ‘2025-01-01’;. Если данные хранятся в виде строк, их нужно предварительно преобразовать с помощью функций CAST или STR_TO_DATE, иначе сравнение будет происходить по алфавиту, а не по календарю.
Какие функции SQL помогают изменять формат отображения даты?
В SQL есть функции для форматирования даты под нужный вид. В MySQL часто используют DATE_FORMAT, например: SELECT DATE_FORMAT(order_date, ‘%d.%m.%Y’) FROM orders;, чтобы получить дату в виде ‘04.10.2025’. В PostgreSQL применяют TO_CHAR: SELECT TO_CHAR(order_date, ‘DD.MM.YYYY’);. Такие функции не меняют данные в таблице, а только выводят их в удобном для пользователя виде.
Как использовать даты в условиях выборки для периода времени?
Для выборки данных за определённый период применяются операторы BETWEEN или комбинация >= и <=. Например, SELECT * FROM sales WHERE sale_date BETWEEN '2025-01-01' AND '2025-03-31'; вернёт все продажи за первый квартал 2025 года. Если нужно учитывать время, важно указывать полное значение DATETIME. Также удобно использовать функции для вычисления начала и конца периода, например, LAST_DAY или DATE_ADD, чтобы автоматизировать выборку за месяц или неделю.
Какие типы данных для даты существуют в SQL и чем они отличаются?
В SQL обычно используются несколько типов данных для хранения даты и времени: DATE, TIME, DATETIME, TIMESTAMP и YEAR. Тип DATE хранит только дату (год, месяц, день) без информации о времени. TIME хранит только время (часы, минуты, секунды). DATETIME и TIMESTAMP содержат и дату, и время, но TIMESTAMP дополнительно учитывает часовой пояс и автоматически обновляется при изменении записи. YEAR используется для хранения только года. Выбор типа зависит от того, какие данные вы планируете хранить и как будете их обрабатывать в запросах.
Как правильно вставлять дату в таблицу SQL, чтобы не было ошибок формата?
Для вставки даты важно использовать формат, который понимает конкретная СУБД. В большинстве систем SQL используется формат ‘YYYY-MM-DD’ для даты и ‘YYYY-MM-DD HH:MM:SS’ для даты и времени. Например, чтобы добавить запись с датой 1 октября 2025 года, можно написать: INSERT INTO таблица (дата) VALUES (‘2025-10-01’);. В случае времени добавляется часть времени: INSERT INTO таблица (дата_время) VALUES (‘2025-10-01 14:30:00’);. Также можно применять функции преобразования, например, STR_TO_DATE() в MySQL, если дата представлена в другом формате, чтобы база корректно её распознала.
