
Выбор типа данных для хранения даты в MySQL напрямую влияет на точность и удобство работы с временными значениями. Тип DATE позволяет сохранять календарные даты в формате ‘YYYY-MM-DD’, занимая 3 байта, что подходит для хранения дней рождения, сроков поставок и других событий без времени.
Тип DATETIME хранит дату и время в формате ‘YYYY-MM-DD HH:MM:SS’, используя 8 байт, и подходит для журналирования операций или событий, где важно фиксировать точное время. Для временных меток с учетом часового пояса применяют TIMESTAMP, который автоматически конвертирует время в UTC и обратно при чтении и записи.
Для хранения только времени используют TIME, а для годов достаточно YEAR, что экономит место и упрощает запросы. MySQL предоставляет функции STR_TO_DATE и DATE_FORMAT для конвертации строк и чисел в даты и обратно, что облегчает интеграцию с внешними системами.
Использование CURRENT_TIMESTAMP позволяет автоматически заполнять поля даты и времени при создании или обновлении записей, что уменьшает вероятность ошибок при ручной вставке. Выбор подходящего типа и формата хранения даты улучшает работу с фильтрацией, сортировкой и агрегированием данных.
Использование типа DATE для хранения календарных дат
Тип DATE в MySQL предназначен для хранения календарных дат в формате ‘YYYY-MM-DD’. Поле занимает 3 байта, что делает его компактным для таблиц с большим количеством записей, где время не требуется. Например, удобно использовать для хранения дней рождения, дат публикации документов, сроков исполнения заказов.
При работе с типом DATE важно учитывать диапазон допустимых значений: от ‘1000-01-01’ до ‘9999-12-31’. Вставка значений вне этого диапазона приведет к ошибке или установке ‘0000-00-00’, если включен режим строгой проверки.
Для вставки данных можно использовать как литералы в формате ‘YYYY-MM-DD’, так и функции MySQL STR_TO_DATE для преобразования строк других форматов. Сравнение и фильтрация по полю DATE выполняются напрямую, что позволяет использовать стандартные операторы <, >, = и BETWEEN без дополнительного преобразования.
Рекомендуется индексировать столбцы типа DATE для ускорения поиска по датам и диапазонам. Это особенно важно для отчетов за периоды и выборок с большими таблицами, где полное сканирование таблицы замедляет выполнение запросов.
Формат DATETIME для точного хранения даты и времени

Тип DATETIME хранит дату и время в формате ‘YYYY-MM-DD HH:MM:SS’, используя 8 байт на запись. Он позволяет фиксировать события с точностью до секунды без привязки к часовому поясу, что делает его подходящим для журналирования операций, отметок заказов или логирования пользовательских действий.
При фильтрации записей по DATETIME удобно использовать операторы <, >, = и BETWEEN для выборки событий в определённые промежутки времени. Рекомендуется создавать индексы на полях DATETIME, чтобы ускорить выборки по датам и диапазонам, особенно в таблицах с большим количеством записей.
Для автоматического заполнения времени создания записи можно использовать DEFAULT CURRENT_TIMESTAMP, а для обновления значения при изменении записи – ON UPDATE CURRENT_TIMESTAMP. Это сокращает необходимость ручного ввода и уменьшает риск ошибок при заполнении дат и времени.
Тип TIMESTAMP и работа с часовыми поясами
Тип TIMESTAMP хранит дату и время в формате ‘YYYY-MM-DD HH:MM:SS’, используя 4 байта и фиксируя значения в UTC. При записи MySQL автоматически конвертирует локальное время в UTC, а при чтении возвращает значение с учётом текущего часового пояса сервера или сессии.
Диапазон TIMESTAMP ограничен значениями от ‘1970-01-01 00:00:01’ UTC до ‘2038-01-19 03:14:07’ UTC. Попытка вставки значений за пределами этого диапазона приведёт к ошибке. Для преобразования строк в TIMESTAMP используют функции STR_TO_DATE и UNIX_TIMESTAMP, а для получения времени в конкретном часовом поясе применяют CONVERT_TZ.
TIMESTAMP полезен для ведения логов, фиксации изменений записей и синхронизации данных между серверами в разных часовых поясах. Для автоматического заполнения или обновления поля применяют DEFAULT CURRENT_TIMESTAMP и ON UPDATE CURRENT_TIMESTAMP, что упрощает отслеживание времени событий без ручного ввода.
При выборке и фильтрации данных рекомендуется учитывать часовой пояс, используя CONVERT_TZ для корректного сравнения. Индексация TIMESTAMP ускоряет выборку по диапазонам времени, что особенно важно для таблиц с большим количеством записей.
Хранение времени отдельно с типом TIME
Тип TIME используется для хранения временных значений в формате ‘HH:MM:SS’, занимая 3 байта. Он подходит для фиксации продолжительности событий, рабочих смен, времени работы процессов или расписаний без привязки к дате.
Диапазон значений TIME составляет от ‘-838:59:59’ до ‘838:59:59’, что позволяет хранить длительные интервалы, включая отрицательные значения для расчётов разницы времени. Для вставки данных допустимо использовать литералы ‘HH:MM:SS’ или функции SEC_TO_TIME и TIME_FORMAT для конвертации числовых или строковых значений.
При вычислениях удобно использовать арифметические операции и функции TIME_TO_SEC для перевода времени в секунды и обратно. Это упрощает суммирование интервалов и расчёт разницы между временными точками.
Рекомендуется индексировать столбцы TIME, если необходимо частое выполнение фильтрации или сортировки по времени. Для приложений с графиками работы или длительностью процессов это ускоряет выборки и уменьшает нагрузку на сервер.
Использование YEAR для обозначения года

Тип YEAR предназначен для хранения значения года в диапазоне от 1901 до 2155. Он занимает 1 байт и удобен для полей с указанием года выпуска, финансового периода или календарного года события.
Для вставки данных можно использовать литералы в виде ‘YYYY’ или числовые значения. MySQL автоматически преобразует двухзначные значения в полный формат по правилам 1970–2069 → 20YY, 1970–1969 → 19YY.
Тип YEAR ускоряет фильтрацию и сортировку по году, особенно при работе с отчетными таблицами. Например, для выборки всех заказов за 2024 год можно использовать условие WHERE year_field = 2024.
| Пример использования | Описание |
|---|---|
| INSERT INTO products (name, year_release) VALUES (‘Модель A’, 2023); | Добавление года выпуска товара |
| SELECT * FROM sales WHERE year_sale = 2024; | Выбор всех продаж за 2024 год |
| ALTER TABLE events ADD COLUMN year_event YEAR; | Добавление столбца для хранения года события |
Преобразование строк и чисел в даты с функциями MySQL
Для работы с данными, которые хранятся в виде строк или чисел, MySQL предоставляет набор функций для преобразования их в даты и временные значения. Это важно при интеграции с внешними системами или при импортировании данных из CSV и других форматов.
Основные функции преобразования:
- STR_TO_DATE(str, format) – конвертирует строку str в дату по заданному формату. Пример: STR_TO_DATE(’25/12/2024′, ‘%d/%m/%Y’) вернёт ‘2024-12-25’.
- CAST(expr AS DATE) – преобразует числовое или строковое выражение в тип DATE. Пример: CAST(‘2024-12-25’ AS DATE).
- CAST(expr AS DATETIME) – преобразует выражение в DATETIME. Пример: CAST(‘2024-12-25 14:30:00’ AS DATETIME).
- FROM_UNIXTIME(unix_timestamp) – преобразует Unix-время (секунды с 1970-01-01) в DATETIME. Пример: FROM_UNIXTIME(1700000000) вернёт ‘2023-11-14 06:13:20’.
При обработке числовых значений в формате YYYYMMDD удобно использовать комбинацию функций SUBSTRING и CONCAT для формирования строки и последующего преобразования через STR_TO_DATE.
Рекомендации по использованию:
- Всегда проверять корректность формата исходных данных перед преобразованием, чтобы избежать ‘0000-00-00’.
- Использовать индексы на полях после преобразования только при необходимости частых фильтров по датам.
- Для массовых операций применять функции на этапе импорта данных, чтобы снизить нагрузку на запросы выборки.
Автоматическое заполнение даты с CURRENT_TIMESTAMP
Функция CURRENT_TIMESTAMP позволяет автоматически устанавливать текущее время при создании или обновлении записи в таблице. Она применима к типам TIMESTAMP и DATETIME, упрощая логирование событий и фиксацию времени изменений.
Для автоматического заполнения поля при вставке используют конструкцию:
CREATE TABLE logs (id INT PRIMARY KEY, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
Для обновления поля при изменении записи применяется ON UPDATE CURRENT_TIMESTAMP:
CREATE TABLE orders (id INT PRIMARY KEY, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
Рекомендации по использованию:
- Использовать CURRENT_TIMESTAMP для отслеживания времени создания и изменения записей без ручного ввода.
- При наличии нескольких полей даты в таблице назначать только одно поле с автоматическим обновлением ON UPDATE, чтобы избежать конфликтов.
- Проверять настройку часового пояса сервера, чтобы TIMESTAMP корректно отражал локальное время при чтении и записи.
Сравнение и сортировка записей по дате
Работа с датами в MySQL требует правильного выбора типов данных и методов сравнения. Типы DATE, DATETIME и TIMESTAMP позволяют использовать стандартные операторы сравнения и сортировки.
Основные операции сравнения:
- = – проверка на точное совпадение даты или времени.
- < и > – выбор записей до или после указанной даты.
- BETWEEN – выбор записей в заданном диапазоне дат. Пример: WHERE created_at BETWEEN ‘2024-01-01’ AND ‘2024-12-31’.
- DATE(field) – извлечение только даты из DATETIME или TIMESTAMP для сравнения.
Сортировка выполняется с помощью ORDER BY:
- По возрастанию: ORDER BY date_field ASC
- По убыванию: ORDER BY date_field DESC
Рекомендации для оптимизации:
- Индексировать поля даты для ускорения фильтрации и сортировки, особенно при больших таблицах.
- Использовать функции преобразования дат (например, DATE или STR_TO_DATE) только при необходимости, чтобы не блокировать использование индексов.
- При работе с TIMESTAMP учитывать часовой пояс для корректного сравнения и сортировки записей между разными регионами.
Вопрос-ответ:
Какой тип данных MySQL лучше использовать для хранения только даты без времени?
Для хранения исключительно календарных дат следует использовать тип DATE. Он хранит значения в формате ‘YYYY-MM-DD’ и занимает 3 байта. Такой тип подходит для дней рождения, сроков поставок или дат публикации документов, где время не требуется.
В чем разница между DATETIME и TIMESTAMP в MySQL?
Тип DATETIME хранит дату и время без учёта часового пояса в формате ‘YYYY-MM-DD HH:MM:SS’, а TIMESTAMP хранит значения в UTC и автоматически конвертирует их в локальное время при чтении. TIMESTAMP удобен для логирования и синхронизации данных между серверами с разными часовыми поясами, но имеет диапазон от ‘1970-01-01 00:00:01’ до ‘2038-01-19 03:14:07’, тогда как DATETIME охватывает диапазон от ‘1000-01-01 00:00:00’ до ‘9999-12-31 23:59:59’.
Как автоматически фиксировать время создания и обновления записи в таблице?
Можно использовать CURRENT_TIMESTAMP. Для поля, фиксирующего создание записи, применяют DEFAULT CURRENT_TIMESTAMP. Для поля, которое должно обновляться при изменении записи, используют ON UPDATE CURRENT_TIMESTAMP. Это позволяет записывать время событий без ручного ввода и уменьшает риск ошибок при логировании.
Как преобразовать строку или число в дату для MySQL?
Для конвертации используют функции STR_TO_DATE и CAST. Например, STR_TO_DATE(’25/12/2024′, ‘%d/%m/%Y’) превращает строку в DATE. Для числовых форматов, например YYYYMMDD, можно использовать комбинацию SUBSTRING и CONCAT, а затем STR_TO_DATE. Для Unix-времени используют FROM_UNIXTIME, чтобы получить DATETIME.
Какие методы ускоряют выборку и сортировку записей по дате?
Для ускорения выборки и сортировки рекомендуется индексировать столбцы типов DATE, DATETIME и TIMESTAMP. При фильтрации по диапазону дат полезно использовать оператор BETWEEN. Функции преобразования дат лучше применять до выполнения выборки, так как их использование в условиях WHERE на больших таблицах может блокировать индексы и замедлять запросы.
Когда стоит использовать тип DATE вместо DATETIME или TIMESTAMP?
Тип DATE подходит для случаев, когда нужно хранить только календарные даты без времени. Например, дни рождения, даты событий, сроки оплаты или окончания проектов. Он занимает меньше памяти, чем DATETIME, и упрощает фильтрацию по датам, так как не требует игнорирования части времени при сравнении.
Как правильно хранить и обрабатывать временные интервалы, превышающие 24 часа?
Для хранения длительных интервалов лучше использовать тип TIME, так как он поддерживает значения от ‘-838:59:59’ до ‘838:59:59’. Для вычислений удобно переводить время в секунды с помощью TIME_TO_SEC, выполнять арифметические операции и обратно преобразовывать в формат ‘HH:MM:SS’ через SEC_TO_TIME. Такой подход упрощает суммирование длительных событий и расчёт разницы между временными точками.
