13.2.2 Типы DATE, DATETIME и TIMESTAMP
Типы DATE, DATETIME и TIMESTAMP взаимосвязаны. В этом разделе описываются их характеристики, сходства и различия. MySQL распознает значения DATE, DATETIME и TIMESTAMP в нескольких форматах, описанных в разделе 11.1.3 «Литералы дат и времени». Для описания диапазонов DATE и DATETIME, “поддерживаемые” означает, что, хотя более ранние значения могут работать, это не гарантируется.
Тип DATE используется для значений с датой, но без времени. MySQL извлекает и отображает значения DATE в формате '. Поддерживаемый диапазон — YYYY-MM-DD''1000-01-01' по '9999-12-31'.
Тип DATETIME используется для значений, содержащих как дату, так и время. MySQL извлекает и отображает значения DATETIME в формате '. Поддерживаемый диапазон — YYYY-MM-DD
hh:mm:ss''1000-01-01 00:00:00' по '9999-12-31
23:59:59'.
Тип данных TIMESTAMP используется для значений, содержащих как дату, так и время. Диапазон TIMESTAMP от '1970-01-01
00:00:01' UTC до '2038-01-19
03:14:07' UTC.
Значения DATETIME или TIMESTAMP могут включать конечную дробную часть секунды с точностью до микросекунд (6 цифр). В частности, любая дробная часть в значении, вставленном в столбец DATETIME или TIMESTAMP, сохраняется, а не отбрасывается. С включенной дробной частью формат для этих значений — ', диапазон для значений YYYY-MM-DD
hh:mm:ss[.fraction]'DATETIME — '1000-01-01 00:00:00.000000' по '9999-12-31 23:59:59.499999', а диапазон для значений TIMESTAMP — '1970-01-01
00:00:01.000000' по '2038-01-19
03:14:07.499999'. Дробная часть всегда должна быть отделена от остальной части времени десятичной точкой; другие разделители дробных секунд не распознаются. Сведения о поддержке дробных секунд в MySQL см. в разделе 13.2.6 «Дробные секунды во временных значениях».
Типы данных TIMESTAMP и DATETIME предлагают автоматическую инициализацию и обновление текущей даты и времени. Более подробная информация приведена в разделе 13.2.5 «Автоматическая инициализация и обновление для TIMESTAMP и DATETIME».
MySQL преобразует значения TIMESTAMP из текущей временной зоны в UTC для хранения и обратно из UTC в текущую временную зону для извлечения. (Это не происходит для других типов, таких как DATETIME). По умолчанию текущая временная зона для каждого подключения — это временная зона сервера. Временная зона может быть установлена для каждого подключения. Пока настройка временной зоны остается неизменной, вы получаете то же значение, которое сохранили. Если вы сохраняете значение TIMESTAMP, а затем изменяете временную зону и извлекаете значение, извлеченное значение отличается от сохраненного. Это происходит потому, что для преобразования в обоих направлениях не использовалась одна и та же временная зона. Текущая временная зона доступна как значение системной переменной time_zone. Более подробная информация приведена в разделе 7.1.15 «Поддержка временных зон MySQL Server».
При вставке значения TIMESTAMP или DATETIME в таблицу можно указать смещение временной зоны. Более подробная информация и примеры приведены в разделе 11.1.3 «Литералы дат и времени».
Недопустимые значения DATE, DATETIME или TIMESTAMP преобразуются в нулевое значение соответствующего типа ('0000-00-00' или '0000-00-00
00:00:00'), если SQL-режим допускает такое преобразование. Точное поведение зависит от того, включены ли режимы strict SQL и NO_ZERO_DATE SQL-режима; см. раздел 7.1.11 «Режимы SQL сервера».
При извлечении значений TIMESTAMP можно преобразовать их в UTC-значения DATETIME, используя CAST() с оператором AT TIME
ZONE, как показано ниже:
mysql> SELECT col,
> CAST(col AT TIME ZONE INTERVAL '+00:00' AS DATETIME) AS ut
> FROM ts ORDER BY id;
+---------------------+---------------------+
| col | ut |
+---------------------+---------------------+
| 2020-01-01 10:10:10 | 2020-01-01 15:10:10 |
| 2019-12-31 23:40:10 | 2020-01-01 04:40:10 |
| 2020-01-01 13:10:10 | 2020-01-01 18:10:10 |
| 2020-01-01 10:10:10 | 2020-01-01 15:10:10 |
| 2020-01-01 04:40:10 | 2020-01-01 09:40:10 |
| 2020-01-01 18:10:10 | 2020-01-01 23:10:10 |
+---------------------+---------------------+
Полную информацию о синтаксисе и дополнительных примерах см. в описании функции CAST().
Обратите внимание на определенные свойства интерпретации значений дат в MySQL:
-
MySQL допускает «свободный» формат для значений, заданных в виде строк, в котором любой значащий символ может использоваться в качестве разделителя между частями даты или времени. В некоторых случаях такой синтаксис может быть вводящим в заблуждение. Например, значение, такое как
'10:11:12', может выглядеть как временное значение из-за:, но интерпретируется как год'2010-11-12', если используется в контексте даты. Значение'10:45:15'преобразуется в'0000-00-00', потому что'45'— не допустимый месяц.Единственный разделитель, распознаваемый между частью даты/времени и частью дробных секунд, — десятичная точка.
Сервер требует, чтобы значения месяца и дня были допустимыми, а не просто находились в диапазоне от 1 до 12 и от 1 до 31 соответственно. При выключенном режиме strict недопустимые даты, такие как
'2004-04-31', преобразуются в'0000-00-00', и генерируется предупреждение. При включенном режиме strict недопустимые даты генерируют ошибку. Для разрешения таких дат включитеALLOW_INVALID_DATES. Более подробная информация приведена в разделе 7.1.11 «Режимы SQL сервера».MySQL не принимает значения
TIMESTAMP, которые включают ноль в столбце день или месяц, или значения, которые не являются допустимой датой. Единственным исключением из этого правила является специальное «нулевое» значение'0000-00-00 00:00:00', если SQL-режим допускает это значение. Точное поведение зависит от того, включены ли режимы strict SQL иNO_ZERO_DATESQL-режима; см. раздел 7.1.11 «Режимы SQL сервера».-
Даты, содержащие значения года с двумя цифрами, неоднозначны, так как век неизвестен. MySQL интерпретирует значения с двумя цифрами, используя следующие правила:
Значения года в диапазоне
00-69становятся2000-2069.Значения года в диапазоне
70-99становятся1970-1999.
См. также раздел 13.2.9 «Годы с двумя цифрами в датах».
© 2025 Oracle
Licensed under the GPLv2 License.