1. ホーム
  2. マイスル

[解決済み】MySQLの現在のタイムゾーンを取得する方法は?

2022-04-03 14:16:48

質問

MySQLにそのような関数があるかどうか、どなたかご存知ですか?

アップデイト

これは有効な情報を出力しません。

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+

あるいは、MySQL 自身が正確な time_zone を使うことができます。 PHP のように、有効な情報を得ることができるのであれば、ここで。 SYSTEM ...

解決方法は?

マニュアルより( セクション9.6 ):

グローバルタイムゾーンとクライアント固有のタイムゾーンの現在値は、次のように取得できます。

mysql> SELECT @@global.time_zone, @@session.time_zone;

編集 上記は SYSTEM は、MySQL がシステムのタイムゾーンを使用するように設定されている場合、これはあまり役に立ちません。PHPを使用しているので、もしMySQLからの答えが SYSTEM であれば、システムにタイムゾーンを問い合わせることができます。 それは を使用しています。 date_default_timezone_get . (もちろん、VolkerK が指摘するように、PHP は別のサーバで動作しているかもしれませんが、仮定として、Web サーバとその通信相手である DB サーバが に設定されています。 [実際にそうでない場合 同じタイムゾーンではありません。 巨大 を跳ぶ)。しかし、(MySQL と同様に) PHP が使用するタイムゾーンを設定することができることに注意しましょう ( date_default_timezone_set )、OSが使用している値とは異なる値を報告する可能性があることを意味します。PHPのコードを制御しているのであれば、そのようなことをしていても大丈夫なのかがわかるはずです。

しかし、MySQL サーバがどのタイムゾーンを使用しているかという質問全体は、余談かもしれません。 全く何もない は、データベースのデータに関するものです。詳しくはこちらをご覧ください。

さらなる議論 :

サーバーを制御している場合は、もちろんタイムゾーンが既知であることを確認することができます。もしあなたがサーバーを制御できないのであれば、使用するタイムゾーンを 接続 このように

set time_zone = '+00:00';

これにより、タイムゾーンが GMT に設定され、それ以降の操作(たとえば now() ) は GMT を使用します。

ただし、時刻と日付の値は ではなく は、MySQL にタイムゾーン情報とともに保存されます。

mysql> create table foo (tstamp datetime) Engine=MyISAM;
Query OK, 0 rows affected (0.06 sec)

mysql> insert into foo (tstamp) values (now());
Query OK, 1 row affected (0.00 sec)

mysql> set time_zone = '+01:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select tstamp from foo;
+---------------------+
| tstamp              |
+---------------------+
| 2010-05-29 08:31:59 |
+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone = '+02:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select tstamp from foo;
+---------------------+
| tstamp              |
+---------------------+
| 2010-05-29 08:31:59 |      <== Note, no change!
+---------------------+
1 row in set (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2010-05-29 10:32:32 |
+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2010-05-29 08:32:38 |      <== Note, it changed!
+---------------------+
1 row in set (0.00 sec)

つまり、サーバーのタイムゾーンを知ることが重要なのは、次のような、今現在の時刻を取得する関数の場合のみです。 now() , unix_timestamp() データベースデータの日付がどのタイムゾーンを使用しているかについては、何も教えてくれません。例えば とする サーバーのタイムゾーンを使用して書き込まれたものですが、その仮定には欠陥がある可能性があります。データに保存されている日付や時刻のタイムゾーンを知るには、タイムゾーン情報とともに保存されていることを確認するか、(私のように)常にGMTで保存されていることを確認する必要があります。

なぜ、データがサーバーのタイムゾーンを使用して書き込まれたと仮定すると欠陥があるのでしょうか?一つには、データが異なるタイムゾーンを設定した接続を使って書き込まれた可能性があるからです。データベースがあるサーバーから別のサーバーに移動し、そのサーバーが異なるタイムゾーンにある可能性もあります(私は、テキサスからカリフォルニアに移動したデータベースを引き継いだときに、このような事態に遭遇しました)。しかし としても サーバーに書き込まれたデータは、現在のタイムゾーンのままでは、まだ曖昧なままです。昨年、アメリカでは11月1日の午前2時にサマータイムがオフになりました。私のサーバーがカリフォルニアで太平洋時間帯を使用していて、次のような値を持っているとします。 2009-11-01 01:30:00 をデータベースに登録します。それはいつのことでしょうか?11月1日PDT午前1時30分でしょうか、それとも11月1日PST午前1時30分(1時間後)でしょうか?まったく知る由もありません。教訓:日付や時刻は常にGMT(サマータイム適用なし)で保存し、必要なときに必要なタイムゾーンに変換する。