MySQL установить время UTC в качестве временной метки по умолчанию

35

Как установить столбец отметки времени, значением по умолчанию которого является текущее время UTC?

MySQL использует UTC_TIMESTAMP()функцию для отметки времени UTC:

mysql> SELECT UTC_TIMESTAMP();
+---------------------+
| UTC_TIMESTAMP()     |
+---------------------+
| 2012-07-01 11:36:35 |
+---------------------+
1 row in set (0.00 sec)

Итак, я попробовал:

CREATE TABLE `blah` (
`creation_time` TIMESTAMP DEFAULT UTC_TIMESTAMP,
...

И другие варианты, вроде бы UTC_TIMESTAMP(), но безуспешно.

Адам Матан
источник
Ты пробовал CURRENT_TIMESTAMP?
ypercubeᵀᴹ
1
Это работает, но не хранит локальное значение часового пояса вместо UTC.
Адам Матан
Что именно вы хотите сделать? Сохранить в столбце таблицы метку времени UTC? Или что-то другое?
ypercubeᵀᴹ
8
Из типов DATE, DATETIME и TIMESTAMP :MySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval.
ypercubeᵀᴹ
3
Помните, что хранилище в формате UTC относится только к типу данных TIMESTAMP, а не к DATE и DATETIME (хотя вы можете установить их по умолчанию CURRENT_TIMESTAMP). Из одной и той же страницы документации: (This does not occur for other types such as DATETIME.).
AronVanAmmers

Ответы:

49

Чтобы согласиться с комментарием @ ypercube, который CURRENT_TIMESTAMPхранится как UTC, но извлекается как текущий часовой пояс, вы можете повлиять на настройку часового пояса вашего сервера с параметром --default_time_zone для получения. Это позволяет вашему поиску всегда быть в UTC.

По умолчанию опция «SYSTEM» - это то, как установлен часовой пояс вашей системы (который может быть или не быть UTC!):

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+
1 row in set (0.00 sec)

mysql> SELECT CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2012-09-25 16:28:45 |
+---------------------+
1 row in set (0.00 sec)

Вы можете установить это динамически:

mysql> SET @@session.time_zone='+00:00';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | +00:00              |
+--------------------+---------------------+
1 row in set (0.00 sec)

Или постоянно в вашем my.cnf:

[mysqld]
**other variables**
default_time_zone='+00:00'

Перезагрузите сервер, и вы увидите изменения:

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| +00:00             | +00:00              |
+--------------------+---------------------+
1 row in set (0.00 sec)

mysql> SELECT CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2012-09-25 20:27:50 |
+---------------------+
1 row in set (0.01 sec)
Дерек Дауни
источник
2
Очень полезный пост !!
om39a
Можно ли указать default_time_zoneдля конкретной таблицы или базы данных? Спасибо.
WM
2
Можно ли указать default_time_zone для конкретного запроса?
mcmillab
@mcmillab вы можете установить часовой пояс сеанса до выполнения запроса, а затем сбросить его до глобального часового пояса перед выполнением дальнейших запросов (или повторно подключиться).
Дерек Дауни
Далее по mcmillab - или для запроса столбца с оператором, который показывает базовое значение UTC (поскольку преобразование не 1-to1)?
Марк Л.
4

Вы не можете указать UTC_TIMESTAMPпо умолчанию, чтобы указать автоматические свойства, Вы должны использовать только DEFAULT CURRENT_TIMESTAMPи ON UPDATE CURRENT_TIMESTAMPпредложения.

Также вы можете вставить UTC_TIMESTAMPзначения, как это, хотя для таблицы:

CREATE TABLE `test` (
  `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Запрос INSERT должен быть таким, чтобы вставить UTC_TImeSTAMP:

insert into `test` (`ts`) 
values
  (utc_timestamp()) ;
Махеш Патил
источник
Спасибо за «Вы не можете указать UTC_TIMESTAMP в качестве значения по умолчанию для указания автоматических свойств»
Barbaros Alp
4

Мое решение с триггером:

DELIMITER //
CREATE TRIGGER `update_to_utc` BEFORE INSERT ON `my_table` FOR EACH ROW BEGIN
set new.my_field=utc_timestamp();
END//
DELIMITER ;

Тогда каждая новая вставленная строка будет иметь метку времени в формате UTC.

Alqin
источник
1

для mariadb работали только глобальные решения my.cnf

для mariadb 10.2 - постоянное решение @Derek Downey в этом посте.

[mysqld]
**other variables**
default_time_zone='+00:00'

для mariadb 10.0 (у меня было 10.0.32), см. https://stackoverflow.com/questions/947299/how-do-i-make-mysqls-now-and-curdate-functions-use-utc

[mysqld_safe]
**other variables**
timezone = UTC

оба определения могут сосуществовать в my.cnf mariadb 10.2, но у меня больше нет mariadb 10.0.

Надеюсь, что это поможет вам.

Алекс Боднару
источник