Пользовательское время в MYSQL при обновлении - PullRequest
1 голос
/ 28 июля 2011

У меня есть таблица с несколькими строками, и внутри них есть определение, которое выглядит так:

  `metric_update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,

Итак, что я на самом деле хочу, это автоматически вставлять метку времени при вставке данных в эту таблицу. И это так. Но мне нужно записать время по Гринвичу в это поле (текущее время сервера как GMT + 2).

Есть ли способ сказать MYSQL, чтобы сделать такую ​​вещь?

Ответы [ 2 ]

2 голосов
/ 28 июля 2011

Если ваш сервер настройки времени и часового пояса настроены правильно, то внутренне все времена, хранящиеся в столбцах TIMESTAMP, преобразуются в GMT (поскольку это то, что Unix timestamp мандаты ). Они преобразуются обратно в ваш часовой пояс сеанса, когда вы получаете эти данные. Если вы хотите, чтобы оно отображалось в часовом поясе GMT, вам нужно выполнить преобразование при получении данных, а не при вставке.

См. Дамп консоли ниже, например. Вы можете выполнить эти команды самостоятельно, чтобы проверить.

mysql> use test;
Database changed
mysql> -- let's create a table we'll be working with
mysql> CREATE TABLE tsTable (
    -> ID INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    -> ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    -> );
Query OK, 0 rows affected (0.08 sec)

mysql> -- let's check current time as well as timezone settings
mysql> SELECT CURTIME(),@@global.time_zone, @@session.time_zone;
+-----------+--------------------+---------------------+
| CURTIME() | @@global.time_zone | @@session.time_zone |
+-----------+--------------------+---------------------+
| 16:25:51  | SYSTEM             | +02:00              |
+-----------+--------------------+---------------------+
1 row in set (0.05 sec)

mysql> -- inserting empty row to table to trigger auto timestamp
mysql> INSERT INTO tsTable VALUES (null,null);
Query OK, 1 row affected (0.00 sec)

mysql> -- looks like the time in my local timezone is stored in table
mysql> SELECT * FROM tsTable;
+----+---------------------+
| ID | ts                  |
+----+---------------------+
|  1 | 2011-07-28 16:26:25 |
+----+---------------------+
1 row in set (0.00 sec)

mysql> -- switching to GMT
mysql> SET SESSION time_zone = '+0:00';
Query OK, 0 rows affected (0.00 sec)

mysql> -- check current time and timezone settings again
mysql> SELECT CURTIME(),@@global.time_zone, @@session.time_zone;
+-----------+--------------------+---------------------+
| CURTIME() | @@global.time_zone | @@session.time_zone |
+-----------+--------------------+---------------------+
| 14:27:53  | SYSTEM             | +00:00              |
+-----------+--------------------+---------------------+
1 row in set (0.00 sec)

mysql> -- note: CURTIME() returns time two hours 'earlier' than before
mysql> -- let's see what's stored in the table again
mysql> SELECT * FROM tsTable;
+----+---------------------+
| ID | ts                  |
+----+---------------------+
|  1 | 2011-07-28 14:26:25 |
+----+---------------------+
1 row in set (0.00 sec)

mysql> -- TIMESTAMP is two hours 'earlier' than before too! Magick!
0 голосов
/ 28 июля 2011
INSERT INTO table_name(column1, metric_update_time) VALUES('dummy', CONVERT_TZ(CURRENT_TIMESTAMP,'+02:00','+03:00');

Это преобразует вставленную метку времени из GMT+2 в GMT+3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...