Spec-Zone.ru › MySQL 9.2

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_DATE SQL-режима; см. раздел 7.1.11 «Режимы SQL сервера».

  • Даты, содержащие значения года с двумя цифрами, неоднозначны, так как век неизвестен. MySQL интерпретирует значения с двумя цифрами, используя следующие правила:

    • Значения года в диапазоне 00-69 становятся 2000-2069.

    • Значения года в диапазоне 70-99 становятся 1970-1999.

    См. также раздел 13.2.9 «Годы с двумя цифрами в датах».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/datetime.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API