- 17 октября 2026
- 12 минут
- 3
Статью подготовили специалисты образовательного сервиса Zaochnik.
Типы данных date и timestamp в базах данных
Тип данных date и тип данных timestamp используются для хранения информации о дате и времени в системах управления базами данных (СУБД). Эти типы обеспечивают точное представление данных за счет фиксированных форматов и заданных диапазонов значений.
Тип данных date - это тип, предназначенный для хранения календарных дат в формате года, месяца и дня.
Основные типы данных даты и времени и их диапазоны
В MySQL определено пять основных типов для хранения даты и времени: YEAR, TIME, TIMESTAMP, DATE и DATETIME. Каждый тип имеет специфический формат и диапазон значений. Это позволяет использовать их в разных случаях с учетом требований точности и объема информации. Например, DATE хранит только дату, а DATETIME — дату с точностью до секунды.
Для типа DATE формат представлен как «YYYY-MM-DD». Допустимый диапазон значений начинается с 1 января 1000 года (1000-01-01) и заканчивается 31 декабря 9999 года (9999-12-31). Конкретно год занимает четыре знака и изменяется в пределах от 1000 до 9999.
Тип TIMESTAMP хранит дату и время в формате «YYYY-MM-DD HH:MM:SS». Диапазон ограничен периодом от 1970-01-01 00:00:01 до 2038-01-19 03:14:07 UTC, что обусловлено системой хранения данных как количество секунд от начала эпохи UNIX. Это ограничение определяет граничные условия применения типа TIMESTAMP, особенно в историческом и будущем интервале.
Для DATETIME используется такой же формат, как у TIMESTAMP, «YYYY-MM-DD HH:MM:SS», но диапазон значительно шире — от «1000-01-01 00:00:00» до «9999-12-31 23:59:59». Такой тип применяется для ситуаций, когда важен более обширный временной диапазон, не ограниченный UNIX-эпохой.
Тип TIME нацелен на хранение временных интервалов и отображается в формате «HH:MM:SS». Допустимый диапазон значений от «-838:59:59» до «838:59:59» позволяет учитывать временные промежутки продолжительностью более 34 суток. Для значений времени свыше 99 часов допускается использование формата с трёхзначным числом часов (HHH). Это существенно расширяет возможности для хранения длительных промежутков в пределах более 2000 часов.
Тип YEAR занимает 1 байт памяти и хранит только год в формате четырёх цифр. Диапазон значений от 1901 до 2155 обеспечивает хранение столетий с начала XX века и до середины XXI. При попытке записи значения вне этого диапазона будет сохранено специальное значение «0000», означающее ошибочное или отсутствующее значение.
Тип данных timestamp - это тип, предназначенный для хранения даты и времени с точностью до секунды, имеющий ограниченный диапазон с 1970 по 2038 год.
Особенности обработки и конвертации значений в MySQL
MySQL использует собственные механизмы валидации и конвертации значений типов даты и времени. В отличие от строгих стандартов ISO, некоторые значения, например 1999-11-31, считаются допустимыми на уровне хранения, однако считаются некорректными с точки зрения календаря. Проверка таких данных перекладывается на прикладные программы, что максимально ускоряет запросы на уровне СУБД.
В механизме MySQL для типов DATE и DATETIME возможна запись дат с нулевыми месяцем или числом, например, 1999-00-00 или 1999-01-00. Это связано с необходимостью поддержки реальных сценариев, где дата известна не полностью, например, неизвестен день рождения. Однако при использовании вычислительных функций DATE_ADD или DATE_SUB такие значения могут привести к неправильным результатам, так как функции рассчитывают даты как абсолютно валидные, и нулевые компоненты вызывают сбои или ошибки в вычислениях.
MySQL позволяет вводить даты в нескольких форматах (например, «YY-MM-DD» и «YYYY-MM-DD»), но при этом ожидает порядок год-месяц-день. При использовании формата с двумя цифрами года возникает неоднозначность, которая решается преобразованием в четырехзначное значение по правилам.
При использовании двухзначного года MySQL интерпретирует его согласно следующему алгоритму: если значение года находится в диапазоне от 00 до 69, то к году добавляется префикс 20 — получается 2000–2069. Если от 70 до 99 — добавляется префикс 19 — получается 1970–1999. Этот механизм исключает проблему Y2K в рамках системы, но требует осторожности при работе со старыми данными или развитием на долгий срок.
Автоматическое обновление и особенности типа TIMESTAMP
Тип данных TIMESTAMP поддерживает автоматическую установку текущего времени при операциях INSERT или UPDATE. При добавлении новой строки, в столбце TIMESTAMP автоматически фиксируется время создания, если явно не указано иное значение.
Однако, в таблице может быть несколько столбцов TIMESTAMP, но автоматическое обновление этой метки применяется только к первому такому столбцу. Это ограничение важно учитывать при проектировании схемы базы данных, чтобы избежать несовпадений и ошибок актуализации временных меток.
Из-за внутреннего формата хранения в момент изменения строки данные типа TIMESTAMP преобразуются из текстового представления в число секунд от эпохи UNIX. Это упрощает сравнение времени и сортировку по этим колонкам, но накладывает ограничения по диапазону.
Обработка значений вне диапазона и ошибочные данные
Для типов DATE, DATETIME и TIMESTAMP MySQL автоматически преобразует недопустимые или выходящие за пределы допустимых интервалов значения в нулевое значение «0000-00-00 00:00:00» для DATETIME и «0000-00-00» для DATE. Это помогает избежать накопления неверных данных в базе, одновременно делая ошибочные записи прозрачными для приложения.
В случае с типом TIME значения, выходящие за диапазон [-838:59:59; 838:59:59], не конвертируются в нули, а усекаются до ближайшей граничной точки. Например, значение «900:00:00» будет приведено к «838:59:59». Такой подход позволяет использовать тип TIME для хранения длительных интервалов, не попадающих в стандартные 24 часа, при этом сохраняя корректность в пределах обработки.
Следует учитывать, что автоматическое преобразование некорректных значений может вызвать ошибки при вычислениях, если приложение не проводит дополнительной проверки корреляции дат и времени или не обрабатывает их как особый случай.
Сводная таблица форматов и ограничений типов данных даты и времени
Ниже приведена сводная таблица с основными характеристиками типов данных для даты и времени в MySQL, включающая форматы, допустимые диапазоны, объемы памяти и особенности обработки.
| Тип данных | Формат представления | Диапазон значений | Объем памяти (байты) | Особенности |
|---|---|---|---|---|
| DATE | YYYY-MM-DD | 1000-01-01 – 9999-12-31 | 3 | Хранит только дату без времени |
| DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 – 9999-12-31 23:59:59 | 8 | Дата и время, позвольте более широкий диапазон, чем TIMESTAMP |
| TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 – 2038-01-19 03:14:07 | 4 | Автоматическое обновление; хранится как UNIX-время |
| TIME | HH:MM:SS (до HHH:MM:SS) | -838:59:59 – 838:59:59 | 3 | Предназначен для временных интервалов; значения вне диапазона усекаются |
| YEAR | YYYY | 1901 – 2155 | 1 | Хранит только год; значения вне диапазона преобразуются в 0000 |
Таблица позволяет выбирать подходящие типы для конкретных задач с учетом требований к размеру данных, допустимому диапазону и необходимой точности.
Типичные ошибки и граничные условия при использовании date и timestamp
Одной из распространённых ошибок является использование двухзначного формата года без явного преобразования в четырёхзначный, что приводит к неправильной интерпретации и логическим ошибкам в вычислениях или отчетах. При проектировании баз данных следует сразу предусматривать четкий формат хранения с четырьмя цифрами для года.
Использование в MySQL значений с нулями в днях или месяцах может приводить к некорректной работе функций вычисления даты, таких как DATE_ADD и DATE_SUB. Нередко к ошибкам приводит неправильная интерпретация таких «нулевых дат» на стороне бизнес-логики, особенно при миграциях данных или верхнем уровне обработки.
Тип TIMESTAMP ограничен по диапазону будущих дат до 19 января 2038 года из-за формата хранения как 32-битного знакового числа секунд. Это граничное условие требует внимательного планирования систем, которым предстоит работать с датами дальше указанного срока. Возможна миграция на другие типы (DATETIME) или использование 64-битных решений в новых СУБД.
Автоматическое обновление TIMESTAMP при выполнении UPDATE затрагивает исключительно первый TIMESTAMP-столбец, что нередко приводит к неучтенным изменениям, если схема таблицы не предусматривает это ограничение.
Недопустимо полагаться на автоматическую конвертацию некорректных дат MySQL, поскольку она позволяет хранить несоответствующие календарю значения и пересчитывать их числовыом формате, например функции возвращают неверные результаты или вызывают сбои.
Рекомендации по выбору и применению
Выбирать тип данных для хранения даты следует исходя из будущего диапазона и точности. Если достаточно даты без времени и диапазон ограничен, выгодно использовать DATE с минимальным объемом памяти — 3 байта на значение.
Для фиксации времени с датой предпочтителен DATETIME, особенно если диапазон должен превышать 1970–2038 годы. Он занимает 8 байт, что комфортно для большинства прикладных задач.
TIMESTAMP рекомендуется использовать для отметки времени создания или обновления записи с автоматическим обновлением. Для таких задач этот тип удобен, но диапазон ограничен UNIX-эпохой.
TIME используется преимущественно для временных промежутков, когда важна продолжительность, а не абсолютная дата — длительность до 838 часов позволяет рассчитывать длительные периоды.
YEAR эффективен в сценариях, где достаточно хранить только год (например, год выпуска товара или год рождения). За счет 1 байта экономится место при большом объеме данных.
Ниже перечислены рекомендации по применению типов данных даты и времени:
- Если необходима фиксация даты без времени, использовать тип DATE.
- Для хранения дат с временем, выходящим за рамки UNIX-эпохи, использовать DATETIME.
- Если нужна метка времени с автоматическим обновлением и диапазон 1970–2038 приемлем, использовать TIMESTAMP.
- Для хранения временных интервалов, превышающих 24 часа, применять тип TIME, учитывая ограничения по диапазону.
- Год хранить в YEAR, если требуется минимальный объем и достаточно только года, не полной даты.