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
Від типів дати, дати та часу :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.

За замовчуванням опція - "СИСТЕМА" - це спосіб встановлення часового поясу системи (який може бути, а може і не бути 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 -1)?
Марк Л.

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.


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.

сподіваюся, що це вам допоможе.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.