Spec-Zone.ru › MariaDB

ВРЕМЯ

Синтаксис

TIMESTAMP [(<microsecond precision)]

Описание

Временная метка в формате YYYY-MM-DD HH:MM:SS.ffffff.

Поле временной метки обычно используется для определения момента добавления или обновления строки и по умолчанию автоматически присваивает текущую дату и время при вставке или обновлении записи. Автоматические свойства применяются только к первому полю TIMESTAMP в записи; последующие столбцы TIMESTAMP не будут изменены.

MariaDB включает опцию --mysql56-temporal-format, которая включена по умолчанию, что позволяет MariaDB хранить временные метки TIMESTAMP с использованием того же низкоуровневого формата, что и MySQL 5.6.

Для получения дополнительной информации см. Внутренний формат.

Поддерживаемые значения

MariaDB хранит значения, использующие тип данных TIMESTAMP в виде количества секунд с момента '1970-01-01 00:00:00' (UTC). Это означает, что тип данных TIMESTAMP может содержать значения в диапазоне с '1970-01-01 00:00:01' (UTC) до '2038-01-19 03:14:07' (UTC).

MariaDB также может хранить микросекунды с точностью от 0 до 6. Если точность микросекунд не указана, то по умолчанию используется 0.

Автоматические значения

MariaDB имеет специальное поведение для первого столбца, использующего тип данных TIMESTAMP в определенной таблице, когда системная переменная explicit_defaults_for_timestamp не установлена (что является значением по умолчанию до MariaDB 10.10). Для первого столбца, использующего тип данных TIMESTAMP в определенной таблице, MariaDB автоматически присваивает столбцу следующие свойства:

  • DEFAULT CURRENT_TIMESTAMP
  • ON UPDATE CURRENT_TIMESTAMP

Это означает, что если столбцу не присвоено явное значение в запросе INSERT или UPDATE, MariaDB автоматически инициализирует значение столбца текущей датой и временем.

Эту автоматическую инициализацию для запросов INSERT и UPDATE также можно явно включить для столбца, использующего тип данных TIMESTAMP с помощью указания DEFAULT CURRENT_TIMESTAMP и ON UPDATE CURRENT_TIMESTAMP положений для столбца. В этих положениях принимается любой синоним CURRENT_TIMESTAMP, включая CURRENT_TIMESTAMP(), NOW(), LOCALTIME, LOCALTIME(), LOCALTIMESTAMP, и LOCALTIMESTAMP().

Эту автоматическую инициализацию для запросов INSERT также можно явно отключить для столбца, использующего тип данных TIMESTAMP с помощью указания значения константы DEFAULT. Например, DEFAULT 0.

Эту автоматическую инициализацию для запросов UPDATE также можно явно отключить для столбца, использующего тип данных TIMESTAMP с помощью указания DEFAULT положения для столбца, но без ON UPDATE положения. Если DEFAULT положение явно указано для столбца, использующего тип данных TIMESTAMP , но ON UPDATE положение для столбца не указано, то значение временной метки не будет автоматически изменяться при выполнении оператора UPDATE.

MariaDB также имеет специальное поведение, если NULL присвоено столбцу, использующему тип данных TIMESTAMP . Если столбцу присвоено значение NULL в запросе INSERT или UPDATE, то MariaDB автоматически инициализирует значение столбца текущей датой и временем. Подробности см. в разделе Значения NULL в MariaDB.

Эту автоматическую инициализацию для значений NULL также можно явно отключить для столбца, использующего тип данных TIMESTAMP с помощью указания атрибута NULL для столбца. В этом случае, если значение столбца установлено в NULL, фактическое значение столбца будет установлено в NULL.

Часовые пояса

Если столбец использует тип данных TIMESTAMP , то любые вставленные значения преобразуются из часового пояса сессии в Координированное универсальное время (UTC) при хранении и преобразуются обратно в часовой пояс сессии при извлечении.

MariaDB проверяет литералы TIMESTAMP по отношению к часовому поясу сессии. Например, если определенный временной диапазон никогда не существовал в определенном часовом поясе из-за перехода на летнее время, то значения TIMESTAMP в этом диапазоне будут недопустимыми для этого часового пояса.

В настоящее время MariaDB не хранит идентификатор часового пояса со значением типа данных TIMESTAMP. Дополнительную информацию см. в разделе MDEV-10018.

В настоящее время MariaDB не поддерживает литералы часовых поясов, содержащие идентификаторы часовых поясов. Дополнительную информацию см. в разделе MDEV-11829.

Ограничения

  • Поскольку значение TIMESTAMP хранится как секунды эпохи, значение временной метки '1970-01-01 00:00:00' (UTC) зарезервировано, поскольку вторая #0 используется для представления '0000-00-00 00:00:00'.
  • В MariaDB 5.5 и ранее мог быть только один столбец TIMESTAMP в таблице, у которого CURRENT_TIMESTAMP был определен в качестве значения по умолчанию. Это ограничение больше не применяется с MariaDB 10.0.

SQL_MODE=MAXDB

Если SQL_MODE установлен в MAXDB, поля TIMESTAMP будут безмолвно преобразованы в DATETIME.

Внутренний формат

В MariaDB 10.1.2 был введен новый временной формат из MySQL 5.6, который изменяет работу столбцов TIME, DATETIME и TIMESTAMP на низких уровнях. Эти изменения позволяют этим временным типам данных иметь дробные части и отрицательные значения. Вы можете отключить эту функцию с помощью системной переменной mysql56_temporal_format.

Таблицы, которые включают значения TIMESTAMP , созданные в более старой версии MariaDB или созданные, когда системная переменная mysql56_temporal_format была отключена, продолжают хранить данные в формате более старого типа данных.

Для обновления столбцов таблицы из старого формата в новый формат выполните оператор ALTER TABLE... MODIFY COLUMN , который изменяет столбец на *тот же* тип данных. Это изменение может потребоваться, если вы хотите экспортировать табличный табличный пространство и импортировать его на сервер, на котором mysql56_temporal_format=ON установлено (см. MDEV-15225).

Например, если у вас есть столбец TIMESTAMP в вашей таблице:

SHOW VARIABLES LIKE 'mysql56_temporal_format';

+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| mysql56_temporal_format | ON    |
+-------------------------+-------+

ALTER TABLE example_table MODIFY ts_col TIMESTAMP;

При выполнении MariaDB оператора ALTER TABLE , она преобразует данные из старого временного формата в новый.

В случае, если у вас есть несколько таблиц и столбцов, использующих временные типы данных, которые вы хотите переключить на новый формат, убедитесь, что системная переменная включена, а затем выполните дамп и восстановление с помощью mysqldump. Столбцы, использующие соответствующие временные типы данных, восстанавливаются с использованием нового временного формата.

Начиная с MariaDB 10.5.1 столбцы со старыми временными форматами помечаются комментарием /* mariadb-5.3 */ в выводе операторов SHOW CREATE TABLE, SHOW COLUMNS, DESCRIBE, а также в столбце COLUMN_TYPE таблицы INFORMATION_SCHEMA.COLUMNS Table.

SHOW CREATE TABLE mariadb5312_timestamp\G
*************************** 1. row ***************************
       Table: mariadb5312_timestamp
Create Table: CREATE TABLE `mariadb5312_timestamp` (
  `ts0` timestamp /* mariadb-5.3 */ NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  `ts6` timestamp(6) /* mariadb-5.3 */ NOT NULL DEFAULT '0000-00-00 00:00:00.000000'
) ENGINE=MyISAM DEFAULT CHARSET=latin1

Примечание: До версии MySQL 4.1 использовался другой формат для типа данных TIMESTAMP. Этот формат не поддерживается в MariaDB 5.1 и выше.

Примеры

CREATE TABLE t (id INT, ts TIMESTAMP);

DESC t;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type      | Null | Key | Default           | Extra                       |
+-------+-----------+------+-----+-------------------+-----------------------------+
| id    | int(11)   | YES  |     | NULL              |                             |
| ts    | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+

INSERT INTO t(id)  VALUES (1),(2);

SELECT * FROM t;
+------+---------------------+
| id   | ts                  |
+------+---------------------+
|    1 | 2013-07-22 12:50:05 |
|    2 | 2013-07-22 12:50:05 |
+------+---------------------+

INSERT INTO t  VALUES (3,NULL),(4,'2001-07-22 12:12:12');

SELECT * FROM t;
+------+---------------------+
| id   | ts                  |
+------+---------------------+
|    1 | 2013-07-22 12:50:05 |
|    2 | 2013-07-22 12:50:05 |
|    3 | 2013-07-22 12:51:56 |
|    4 | 2001-07-22 12:12:12 |
+------+---------------------+

Преобразование в эпоху Unix:

SELECT ts, UNIX_TIMESTAMP(ts) FROM t;
+---------------------+--------------------+
| ts                  | UNIX_TIMESTAMP(ts) |
+---------------------+--------------------+
| 2013-07-22 12:50:05 |         1374490205 |
| 2013-07-22 12:50:05 |         1374490205 |
| 2013-07-22 12:51:56 |         1374490316 |
| 2001-07-22 12:12:12 |          995796732 |
+---------------------+--------------------+

Обновление также изменяет временную метку:

UPDATE t set id=5 WHERE id=1;

SELECT * FROM t;
+------+---------------------+
| id   | ts                  |
+------+---------------------+
|    5 | 2013-07-22 14:52:33 |
|    2 | 2013-07-22 12:50:05 |
|    3 | 2013-07-22 12:51:56 |
|    4 | 2001-07-22 12:12:12 |
+------+---------------------+

Значение по умолчанию NULL:

CREATE TABLE t2 (id INT, ts TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP);

INSERT INTO t(id)  VALUES (1),(2);

SELECT * FROM t2;

INSERT INTO t2(id)  VALUES (1),(2);

SELECT * FROM t2;
+------+------+
| id   | ts   |
+------+------+
|    1 | NULL |
|    2 | NULL |
+------+------+

UPDATE t2 SET id=3 WHERE id=1;

SELECT * FROM t2;
+------+---------------------+
| id   | ts                  |
+------+---------------------+
|    3 | 2013-07-22 15:32:22 |
|    2 | NULL                |
+------+---------------------+

Автоматически вставляется и обновляется только первая временная метка:

CREATE TABLE t3 (id INT, ts1 TIMESTAMP, ts2 TIMESTAMP);

INSERT INTO t3(id)  VALUES (1),(2);

SELECT * FROM t3;
+------+---------------------+---------------------+
| id   | ts1                 | ts2                 |
+------+---------------------+---------------------+
|    1 | 2013-07-22 15:35:07 | 0000-00-00 00:00:00 |
|    2 | 2013-07-22 15:35:07 | 0000-00-00 00:00:00 |
+------+---------------------+---------------------+

DESC t3;
+-------+-----------+------+-----+---------------------+-----------------------------+
| Field | Type      | Null | Key | Default             | Extra                       |
+-------+-----------+------+-----+---------------------+-----------------------------+
| id    | int(11)   | YES  |     | NULL                |                             |
| ts1   | timestamp | NO   |     | CURRENT_TIMESTAMP   | on update CURRENT_TIMESTAMP |
| ts2   | timestamp | NO   |     | 0000-00-00 00:00:00 |                             |
+-------+-----------+------+-----+---------------------+-----------------------------+

Явное задание временной метки с помощью функции CURRENT_TIMESTAMP:

INSERT INTO t3(id,ts2)  VALUES (3,CURRENT_TIMESTAMP());

SELECT * FROM t3;
+------+---------------------+---------------------+
| id   | ts1                 | ts2                 |
+------+---------------------+---------------------+
|    1 | 2013-07-22 15:35:07 | 0000-00-00 00:00:00 |
|    2 | 2013-07-22 15:35:07 | 0000-00-00 00:00:00 |
|    3 | 2013-07-22 15:38:52 | 2013-07-22 15:38:52 |
+------+---------------------+---------------------+

Указание временной метки как NOT NULL:

CREATE TABLE t4 (id INT, ts TIMESTAMP NOT NULL);

INSERT INTO t4(id)  VALUES (1);
SELECT SLEEP(1);
INSERT INTO t4(id,ts) VALUES (2,NULL);

SELECT * FROM t4;

См. также

  • Требования к хранению типов данных
Содержимое, воспроизведенное на этом сайте, является собственностью соответствующих владельцев, и это содержание не проверяется заранее компанией MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают взгляды MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/timestamp/

Spec-Zone.ru

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