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としてのストレージは、DATEおよびDATETIMEではなく、TIMESTAMPデータ型にのみ適用されることに注意してください(ただし、デフォルトをに設定できますCURRENT_TIMESTAMP)。同じドキュメントページから:(This does not occur for other types such as DATETIME.)
-AronVanAmmers

回答:


49

CURRENT_TIMESTAMPUTCとして保存されているが、現在のタイムゾーンとして取得される@ypercubeのコメントと一緒に進むには、取得の--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 14年

default_time_zone特定のテーブルまたはデータベースを指定することは可能ですか?ありがとう。
WM

2
特定のクエリにdefault_time_zoneを指定することは可能ですか?
mcmillab

@mcmillabでは、クエリを実行する前にセッションのタイムゾーンを設定し、さらにクエリを実行(または再接続)する前にグローバルタイムゾーンにリセットできます。
デレクダウニー

mcmillabに続いて-または基礎となるUTC値を示す演算子を使用して列をクエリします(変換は1対1ではないため)?
マークL.

4

UTC_TIMESTAMPデフォルトとして自動プロパティを指定することはできません。DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP句のみを使用する必要があります。

またUTC_TIMESTAMP、テーブルに対しても次のような値を挿入できます。

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

UTC_TImeSTAMPを挿入するINSERTクエリは次のようになります。

insert into `test` (`ts`) 
values
  (utc_timestamp()) ;

「UTC_TIMESTAMPをデフォルトとして指定して自動プロパティを指定することはできません」に感謝します
バルバロス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ソリューションのみが機能しました

この投稿の@Derek Downeyの永続的なソリューションであるmariadb 10.2の場合。

[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

mariadb 10.2のmy.cnfには両方の定義が共存する可能性がありますが、mariadb 10.0はもう持っていません。

これがあなたのお役に立てば幸いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.