11.2 Типы данных даты и времени
- 11.2.1 Синтаксис типов данных даты и времени
- 11.2.2 Типы DATE, DATETIME и TIMESTAMP
- 11.2.3 Тип TIME
- 11.2.4 Тип YEAR
- 11.2.5 Ограничения YEAR(2) с двумя значащими цифрами и миграция на YEAR с четырьмя цифрами
- 11.2.6 Автоматическая инициализация и обновление для типов TIMESTAMP и DATETIME
- 11.2.7 Дробные секунды во временных значениях
- 11.2.8 Какой календарь используется MySQL?
- 11.2.9 Преобразование между типами данных даты и времени
- 11.2.10 Двузначные годы в датах
Типы данных даты и времени для представления временных значений — это DATE, TIME, DATETIME, TIMESTAMP и YEAR. Каждый временной тип имеет диапазон допустимых значений, а также значение “ноль”, которое может быть использовано, когда вы указываете недопустимое значение, которое MySQL не может представить. Типы TIMESTAMP и DATETIME имеют специальное поведение автоматического обновления, описанное в Разделе 11.2.6, «Автоматическая инициализация и обновление для TIMESTAMP и DATETIME».
Сведения о требованиях к хранению временных типов данных см. в Разделе 11.7, «Требования к хранению типов данных».
Описание функций, работающих со временными значениями, см. в Разделе 12.7, «Функции даты и времени».
При работе с типами даты и времени следует учитывать следующие общие моменты:
MySQL извлекает значения для заданного типа даты или времени в стандартном формате вывода, но пытается интерпретировать различные форматы входных значений, которые вы предоставляете (например, когда вы указываете значение, которое нужно назначить или сравнить с типом даты или времени). Описание допустимых форматов для типов даты и времени см. в Разделе 9.1.3, «Литералы даты и времени». Ожидается, что вы предоставите корректные значения. При использовании значений в других форматах могут возникнуть непредсказуемые результаты.
Хотя MySQL пытается интерпретировать значения в нескольких форматах, части даты всегда должны быть заданы в порядке год-месяц-день (например,
'98-09-04'), а не в порядке месяц-день-год или день-месяц-год, обычно используемых в других местах (например,'09-04-98','04-09-98'). Для преобразования строк в других порядках в порядок год-месяц-день может быть полезна функцияSTR_TO_DATE().-
Даты, содержащие двузначные значения года, являются неоднозначными, так как век неизвестен. MySQL интерпретирует двузначные значения года по следующим правилам:
Значения года в диапазоне
70-99становятся1970-1999.Значения года в диапазоне
00-69становятся2000-2069.
См. также Раздел 11.2.10, «Двузначные годы в датах».
Преобразование значений из одного временного типа в другой происходит в соответствии с правилами Раздела 11.2.9, «Преобразование между типами данных даты и времени».
MySQL автоматически преобразует значение даты или времени в число, если значение используется в числовом контексте, и наоборот.
По умолчанию, когда MySQL сталкивается со значением для типа даты или времени, которое выходит за пределы допустимого диапазона или иным образом недопустимо для данного типа, оно преобразует значение в значение “ноль” для этого типа. Исключение составляют значения
TIME, выходящие за пределы допустимого диапазона, которые обрезаются до соответствующей конечной точки диапазонаTIME.Установив SQL-режим на соответствующее значение, вы можете более точно указать, какие даты вы хотите поддерживать в MySQL. (См. Раздел 5.1.10, «Серверные SQL-режимы».) Вы можете заставить MySQL принять определенные даты, такие как
'2009-11-31', включив SQL-режимALLOW_INVALID_DATES. Это полезно, когда вы хотите сохранить в базе данных значение «возможно неправильное», указанное пользователем (например, в веб-форме) для последующей обработки. В этом режиме MySQL проверяет только то, что месяц находится в диапазоне от 1 до 12, а день — от 1 до 31.MySQL позволяет хранить даты, где день или месяц и день равны нулю в столбце
DATEилиDATETIME. Это полезно для приложений, которым необходимо хранить даты рождения, точная дата которых может быть неизвестна. В этом случае вы просто храните дату как'2009-00-00'или'2009-01-00'. Однако для таких дат вы не должны ожидать получения корректных результатов для функций, таких какDATE_SUB()илиDATE_ADD(), которые требуют полных дат. Чтобы запретить нулевые значения месяца или дня в датах, включите режимNO_ZERO_IN_DATE.MySQL позволяет хранить значение “ноль”
'0000-00-00'как “фиктивную дату”. В некоторых случаях это удобнее, чем использование значенийNULL, и занимает меньше места в данных и индексах. Чтобы запретить'0000-00-00', включите режимNO_ZERO_DATE.Значения даты или времени “ноль”, используемые через Connector/ODBC, автоматически преобразуются в
NULL, так как ODBC не поддерживает такие значения.
В следующей таблице показан формат значения “ноль” для каждого типа. Значения “ноль” являются специальными, но вы можете явно хранить или ссылаться на них, используя значения, показанные в таблице. Вы также можете сделать это, используя значения '0' или 0, которые проще записывать. Для временных типов, которые включают часть даты (DATE, DATETIME и TIMESTAMP), использование этих значений может вызывать предупреждения или ошибки. Точное поведение зависит от того, какие из строгого режима и NO_ZERO_DATE SQL-режимов включены; см. Раздел 5.1.10, «Серверные SQL-режимы».
| Тип данных | Значение «ноль» |
|---|---|
DATE | '0000-00-00' |
TIME | '00:00:00' |
DATETIME | '0000-00-00 00:00:00' |
TIMESTAMP | '0000-00-00 00:00:00' |
YEAR | 0000 |
© 2025 Oracle
Licensed under the GPLv2 License.