Существующие типы данных даты и времени YEAR, TIME, TIMESTAMP, DATE и DATETIME имеют собственный интервал допустимых значений, среди которых и значение «ноль», использующееся при введении пользователем действительно недопустимого значения.
Заметим, что MySQL может хранить некоторые не совсем достоверные значения даты, к примеру, 1999-11-31. Причиной тому является то, что управлять проверкой даты должно конкретное приложение, а не SQL-сервер. Чтобы ускорить проверку правильности даты, MySQL проверяет попадание месяца в интервал 0–12 и дня в интервал 0–31. Эти интервалы начинаются с 0 с той целью, чтобы MySQL мог хранить в столбцах DATETIME или DATE даты с днем и месяцем равным 0. Такой вариант полезен, например, для приложений, предполагающих хранение даты рождения, когда не всегда известен месяц или день рождения. Тогда хранение даты происходит в виде 1999-00-00 или 1999-01-00 (для таких дат функции DATE_ADD или DATE_SUB() могут дать неправильные значения).
MySQL интерпретирует значения в нескольких форматах, но всегда ожидается, что даты задаются в порядке год-месяц-день (к примеру, '99-08-05'). Значение, которое имеет тип даты или времени, автоматически преобразуется MySQL в число, когда данную величину используют в виде числа, и наоборот.
Значение, которое имеет тип даты или времени и выходит за границы указанного интервала или недопустимо для данного типа данных, MySQL преобразует в значение «ноль». Исключением являются величины типа TIME, которые выходят за границы установленного интервала и усекаются до граничной точки заданного интервала TIME.
В таблице рассмотрены форматы значения «ноль» для каждого типа столбцов:
Проблема 2000 года для типов данных
MySQL устойчив к «проблеме 2000 года», но некоторые входные величины могут стать источниками ошибок. Например, если ввести двухразрядное значение года, то оно будет интерпретироваться неоднозначно, т.к. не указано столетие. Такие значения должны переводиться в четырехразрядную форму, поскольку MySQL для представления года использует 4 разряда.
Даты с неоднозначным годом в MySQL для типов YEAR, TIMESTAMP, DATE и DATETIME интерпретируются согласно правилам:
- значение года от 00 до 69 конвертируется в 2000–2069;
- значение года от 70 до 99 конвертируется в 1970–1999.
Тип TIMESTAMP
Тип TIMESTAMP обеспечивает автоматическую запись текущей даты и времени при использовании операции INSERT или UPDATE. Если используется несколько столбцов типа TIMESTAMP, то автоматически обновляется лишь первый из них.
Тип DATE
Тип DATE содержит величины с информацией о дате в формате 'YYYY-MM-DD'. Для данного типа год может изменяться в пределах диапазона 1000–9999, а значения месяца и числа в пределах года. Т.е. данные обрабатываются в диапазоне '1000-01-01'–'9999-12-31'.
Тип DATETIME
Тип DATETIME используется для величин, которые содержат значения даты и времени. MySQL обрабатывает значения в формате 'YYYY-MM-DD HH:MM:SS', которые соответствуют диапазону '1000-01-01 00:00:00'–'9999-12-31 23:59:59'.
Тип TIME
MySQL обрабатывает значения данного типа в формате 'HH:MM:SS'. Для больших значений часа (при указании временного интервала) используется формат 'HHH:MM:SS'. Значения TIME должны попадать в диапазон от '-838:59:59' до '838:59:59'.
Тип YEAR
Тип данных YEAR является однобайтным и содержит значение года.
MySQL обрабатывает значения в формате YYYY и диапазоне от 1901 до 2155.
Недопустимые значения YEAR преобразуются в 0000.