
В SQL работа с датами требует точного соблюдения формата и корректного выбора функций. Основные типы данных для хранения дат – DATE, DATETIME, TIMESTAMP. Тип DATE хранит только дату в формате ‘YYYY-MM-DD’, DATETIME добавляет время ‘YYYY-MM-DD HH:MI:SS’, а TIMESTAMP учитывает временную зону сервера и автоматически обновляется при изменении записи.
Для задания конкретной даты в запросах INSERT или UPDATE необходимо использовать стандартный SQL-синтаксис с одинарными кавычками: INSERT INTO table_name (date_column) VALUES (‘2025-10-04’);. В MySQL можно также применять функции STR_TO_DATE для преобразования строк в дату с нестандартным форматом, например: STR_TO_DATE(’04-10-2025′,’%d-%m-%Y’).
При фильтрации данных по дате важно учитывать точность сравнения. Оператор = проверяет полное совпадение, включая время в типе DATETIME. Для выборки по диапазону удобны операторы BETWEEN и >= / <=, а функции DATE() или CAST() позволяют игнорировать временную составляющую.
Некорректная запись даты или несоответствие формата приводит к ошибкам или неожиданным результатам. В PostgreSQL используется синтаксис DATE ‘2025-10-04’ для явного задания даты, а функции TO_DATE и TO_TIMESTAMP обеспечивают преобразование строк с любым форматом в корректные значения.
Использование литералов даты в SQL

Литералы даты позволяют явно указывать значения даты или времени в SQL-запросах. Формат зависит от используемой СУБД, но стандарт SQL использует литерал в виде DATE 'YYYY-MM-DD' для даты, TIME 'HH:MI:SS' для времени и TIMESTAMP 'YYYY-MM-DD HH:MI:SS' для даты с временем.
Пример вставки даты в таблицу:
INSERT INTO orders (order_id, order_date) VALUES (101, DATE '2025-10-04');
Для задания временных значений используется литерал времени:
INSERT INTO shifts (shift_id, start_time) VALUES (1, TIME '08:30:00');
Литерал с датой и временем применяется для точного указания момента:
INSERT INTO events (event_id, event_timestamp) VALUES (55, TIMESTAMP '2025-10-04 14:45:00');
В некоторых СУБД, например MySQL, допускается использование строкового формата 'YYYY-MM-DD' или 'YYYY-MM-DD HH:MI:SS', однако явное указание типа через DATE или TIMESTAMP повышает переносимость запросов.
При фильтрации данных литералы даты применяются в условии WHERE:
SELECT * FROM orders WHERE order_date = DATE '2025-10-04';
Использование литералов даты облегчает работу с функциями сравнения, интервалами и вычислением разницы между датами:
SELECT order_id FROM orders WHERE order_date BETWEEN DATE '2025-10-01' AND DATE '2025-10-04';
Форматы записи даты для разных СУБД
MySQL: Основной формат даты – ‘YYYY-MM-DD’ для типа DATE и ‘YYYY-MM-DD HH:MM:SS’ для DATETIME. Для времени используется ‘HH:MM:SS’. Альтернативно возможен ввод через функции STR_TO_DATE() с указанием шаблона, например: STR_TO_DATE(’31/12/2025′,’%d/%m/%Y’).
PostgreSQL: Дата записывается как ‘YYYY-MM-DD’, время как ‘HH:MM:SS’, а полный формат TIMESTAMP – ‘YYYY-MM-DD HH:MM:SS’. Поддерживается ISO 8601 с временной зоной: ‘2025-12-31T23:59:59+03’. Можно использовать функции TO_DATE() и TO_TIMESTAMP() для конверсии строк в дату.
Oracle: Дата хранится в типе DATE, включающем дату и время. Строковый ввод через ‘DD-MON-YYYY’ или ‘YYYY-MM-DD HH24:MI:SS’ с функцией TO_DATE(), например: TO_DATE(’31-DEC-2025′,’DD-MON-YYYY’). Для точного времени используется TIMESTAMP с миллисекундами: ‘YYYY-MM-DD HH24:MI:SS.FF’.
SQL Server: Типы DATE и DATETIME принимают формат ‘YYYY-MM-DD’ и ‘YYYY-MM-DD HH:MM:SS’. Рекомендуется ISO 8601 ‘YYYY-MM-DDTHH:MM:SS’ для совместимости. Для строкового преобразования применяются функции CONVERT() и CAST(), например: CONVERT(DATETIME,’2025-12-31 23:59:59′,120).
SQLite: Даты хранятся как текст в формате ‘YYYY-MM-DD HH:MM:SS’, как число – количество секунд с 1970-01-01, либо в формате Julian Day. Для конверсии используются функции DATE(), TIME(), DATETIME(), например: DATETIME(‘now’,’localtime’).
Для каждой СУБД важно использовать нативный формат при вставке, чтобы избежать ошибок конверсии и проблем с сортировкой. Универсальная практика – ISO 8601 там, где поддерживается, и явное применение функций преобразования для нестандартных форматов.
Функции для преобразования строк в дату
В SQL преобразование строк в дату выполняется с помощью специализированных функций, которые учитывают формат исходной строки. В MySQL используется функция STR_TO_DATE(). Она принимает два аргумента: строку и формат даты. Пример: STR_TO_DATE('2025-10-04','%Y-%m-%d') вернёт значение типа DATE.
В PostgreSQL для преобразования применяется функция TO_DATE(). Она принимает строку и шаблон формата. Например, TO_DATE('04/10/2025','DD/MM/YYYY') создаёт объект DATE. Для временных значений с часами и минутами используют TO_TIMESTAMP(): TO_TIMESTAMP('04-10-2025 14:30','DD-MM-YYYY HH24:MI').
В SQL Server преобразование строк в дату выполняется с помощью CONVERT() или CAST(). Пример с CONVERT(): CONVERT(DATE, '2025-10-04', 120), где 120 – стиль формата ISO. С CAST() запись будет CAST('2025-10-04' AS DATE).
Для Oracle используется TO_DATE() с указанием формата. Пример: TO_DATE('04-10-2025','DD-MM-YYYY'). Для работы с временными метками применяют TO_TIMESTAMP(): TO_TIMESTAMP('04-10-2025 14:30:00','DD-MM-YYYY HH24:MI:SS').
При выборе функции важно соответствие формата строки формату, указанному в функции. Несоответствие вызывает ошибку преобразования. Рекомендуется использовать ISO-формат ‘YYYY-MM-DD’ для минимизации ошибок между СУБД.
Для массовой обработки данных часто применяют преобразование в запросах INSERT или UPDATE: INSERT INTO orders(order_date) VALUES(STR_TO_DATE('04/10/2025','%d/%m/%Y')). Это гарантирует корректное сохранение даты независимо от локали сервера.
Задание текущей даты и времени в запросах

В SQL текущая дата и время могут использоваться для фильтрации записей, вставки временных меток и вычислений с датами. Основные функции зависят от СУБД, но принцип одинаковый: возвращается системная дата и время.
Примеры для популярных СУБД:
- MySQL:
NOW()возвращает дату и время,CURDATE()– только дату,CURTIME()– только время.- Пример запроса:
SELECT NOW() AS current_datetime; - Использование при вставке:
INSERT INTO orders (order_date) VALUES (NOW());
- Пример запроса:
- PostgreSQL:
CURRENT_TIMESTAMPилиNOW()– полный формат даты и времени,CURRENT_DATE– только дата.- Фильтрация записей:
SELECT * FROM events WHERE event_date < NOW();
- Фильтрация записей:
- SQL Server:
GETDATE()возвращает текущую дату и время,SYSDATETIME()– с точностью до наносекунд.- Пример вычисления разницы:
SELECT DATEDIFF(day, GETDATE(), delivery_date) AS days_left FROM shipments;
- Пример вычисления разницы:
- Oracle:
SYSTIMESTAMP– дата с временем и часовым поясом,SYSDATE– только дата и время сервера.- Пример использования:
SELECT * FROM logs WHERE log_time > SYSDATE - 7;(последние 7 дней)
- Пример использования:
Рекомендации при работе с текущей датой и временем:
- Использовать функции СУБД вместо ручного задания даты, чтобы избежать ошибок синхронизации.
- При хранении временных меток учитывать часовой пояс сервера и клиента.
- Для фильтрации по дате лучше использовать диапазоны, чтобы индексирование работало эффективно.
- Для вставки исторических или будущих дат использовать явное преобразование типов, например
CAST('2025-10-04' AS DATE).
Сочетание текущей даты с арифметикой позволяет строить запросы типа «сегодня + 7 дней» или «текущий месяц». Примеры:
- MySQL:
SELECT NOW() + INTERVAL 7 DAY; - PostgreSQL:
SELECT CURRENT_DATE + INTERVAL '7 days'; - SQL Server:
SELECT DATEADD(day, 7, GETDATE()); - Oracle:
SELECT SYSDATE + 7 FROM dual;
Использование текущей даты и времени напрямую в запросах повышает точность отчетности и автоматизацию временных операций.
Сравнение и фильтрация данных по дате
В SQL сравнение дат выполняется с использованием операторов =, <, <=, >, >= и BETWEEN. Для корректной работы важно использовать тип данных DATE, DATETIME или TIMESTAMP. Строковые значения дат необходимо приводить к формату ‘YYYY-MM-DD’.
Пример фильтрации записей за конкретную дату:
SELECT * FROM orders
WHERE order_date = '2025-10-01';
Для выбора диапазона дат применяется оператор BETWEEN:
SELECT * FROM orders
WHERE order_date BETWEEN '2025-10-01' AND '2025-10-05';
Сравнение с динамической датой можно выполнять с функциями NOW() или CURRENT_DATE:
SELECT * FROM events
WHERE event_date >= CURRENT_DATE;
Фильтрация по компонентам даты выполняется через функции YEAR(), MONTH(), DAY():
SELECT * FROM sales
WHERE YEAR(sale_date) = 2025 AND MONTH(sale_date) = 10;
Пример сравнения с использованием нескольких условий:
SELECT * FROM tasks
WHERE due_date < '2025-10-10' AND status = 'pending';
Для быстрого анализа дат можно использовать агрегатные функции с группировкой:
SELECT DATE(order_date) AS day, COUNT(*) AS total_orders
FROM orders
GROUP BY DATE(order_date);
Таблица примеров операторов фильтрации по дате:
| Оператор | Описание | Пример |
|---|---|---|
| = | Совпадение с конкретной датой | WHERE order_date = ‘2025-10-01’ |
| < | Меньше указанной даты | WHERE event_date < ‘2025-10-01’ |
| <= | До указанной даты включительно | WHERE order_date <= ‘2025-10-05’ |
| > | Позже указанной даты | WHERE due_date > ‘2025-10-01’ |
| >= | С указанной даты и позже | WHERE event_date >= CURRENT_DATE |
| BETWEEN | Диапазон дат включительно | WHERE order_date BETWEEN ‘2025-10-01’ AND ‘2025-10-05’ |
Обновление и вставка значений даты в таблицы
Для вставки даты в таблицу используется оператор INSERT INTO с явным указанием формата даты. В SQL Server допустим формат 'YYYY-MM-DD', а в MySQL – также 'YYYY-MM-DD HH:MM:SS' для столбцов типа DATETIME. Пример вставки:
INSERT INTO orders (order_id, order_date) VALUES (1, '2025-10-04');
Для вставки текущей даты используется функция GETDATE() в SQL Server и NOW() в MySQL:
INSERT INTO orders (order_id, order_date) VALUES (2, GETDATE());
Обновление даты выполняется через оператор UPDATE с фильтром WHERE. Например, для корректировки даты заказа:
UPDATE orders SET order_date = '2025-10-05' WHERE order_id = 1;
Можно использовать функции для вычисления новой даты. В MySQL допустимо DATE_ADD и DATE_SUB:
UPDATE orders SET order_date = DATE_ADD(order_date, INTERVAL 1 DAY) WHERE order_id = 2;
Для столбцов TIMESTAMP полезно использовать автоматическое обновление через CURRENT_TIMESTAMP:
UPDATE orders SET order_date = CURRENT_TIMESTAMP WHERE order_id = 3;
При вставке и обновлении важно соблюдать соответствие типов данных: DATE хранит только дату, DATETIME и TIMESTAMP включают время. Ошибки формата приводят к отказу выполнения запроса.
Рекомендуется всегда использовать явный формат даты и функции СУБД для повышения читаемости и предотвращения ошибок при переносе данных между серверами с различными региональными настройками.
Вопрос-ответ:
Как правильно записать дату в SQL, чтобы запрос сработал без ошибок?
В SQL даты обычно записываются в формате ‘YYYY-MM-DD’. Например, чтобы выбрать записи с конкретной датой, можно использовать конструкцию: SELECT * FROM orders WHERE order_date = '2025-10-04';. Важно учитывать, что разные СУБД могут поддерживать разные форматы даты и времени. В некоторых системах допустимо указывать время вместе с датой, например ‘2025-10-04 15:30:00’.
Можно ли в SQL задать дату динамически, используя текущий день?
Да, SQL предоставляет функции для работы с текущей датой. В большинстве СУБД есть функция CURRENT_DATE или GETDATE(), которая возвращает текущую дату. Например: SELECT * FROM events WHERE event_date = CURRENT_DATE;. Это удобно для фильтрации записей по сегодняшнему дню без ручного ввода даты.
Как сравнивать даты в SQL, если нужно выбрать записи за определенный период?
Для сравнения дат используются операторы <, >, <=, >=. Например, чтобы выбрать заказы за первую неделю октября 2025 года, можно написать: SELECT * FROM orders WHERE order_date >= '2025-10-01' AND order_date <= '2025-10-07';. Такой подход позволяет гибко фильтровать данные за любой период.
Что делать, если в таблице даты хранятся в формате текста?
Если даты хранятся как строки, их нужно преобразовать в тип DATE или DATETIME для корректных вычислений и фильтрации. В MySQL можно использовать функцию STR_TO_DATE: STR_TO_DATE(order_date_text, '%Y-%m-%d'). В PostgreSQL используется TO_DATE(order_date_text, 'YYYY-MM-DD'). После преобразования можно применять обычные сравнения и функции работы с датой.
Можно ли в SQL добавлять или вычитать дни к дате?
Да, в SQL есть функции для арифметики с датами. В MySQL можно использовать DATE_ADD или DATE_SUB, например: SELECT DATE_ADD('2025-10-04', INTERVAL 7 DAY); — получаем дату через неделю. В PostgreSQL используется оператор + interval: SELECT '2025-10-04'::date + INTERVAL '7 days';. Это позволяет автоматически рассчитывать даты без ручного подсчета.
