タイムゾーンのサポート

TiDB のタイムゾーンは、グローバルtime_zoneシステム変数とセッションtime_zoneシステム変数によって決定されます。デフォルト値のtime_zoneSYSTEMです。 Systemに対応する実際のタイム ゾーンは、TiDB クラスターのブートストラップが初期化されるときに構成されます。詳細なロジックは次のとおりです。

  • TZ環境変数の使用を優先します。
  • TZ環境変数が失敗した場合は、 /etc/localtimeの実際のソフト リンク アドレスからタイム ゾーンを抽出します。
  • 上記の両方の方法が失敗した場合は、システムのタイムゾーンとしてUTCを使用します。

次のステートメントを使用して、実行時にグローバルサーバーtime_zone値を設定できます。

SET GLOBAL time_zone = timezone;

各クライアントには、セッションtime_zone変数によって指定される独自のタイムゾーン設定があります。最初、セッション変数はグローバルtime_zone変数から値を取得しますが、クライアントは次のステートメントを使用して独自のタイムゾーンを変更できます。

SET time_zone = timezone;

次のステートメントを使用すると、グローバル タイム ゾーン、クライアント固有のタイム ゾーン、およびシステム タイム ゾーンの現在の値を表示できます。

SELECT @@global.time_zone, @@session.time_zone, @@global.system_time_zone;

time_zoneの値の形式を設定するには:

  • 値「SYSTEM」は、タイムゾーンがシステムのタイムゾーンと同じである必要があることを示します。
  • 値は、「+10:00」や「-6:00」など、UTC からのオフセットを示す文字列として指定できます。
  • 値は、「ヨーロッパ/ヘルシンキ」、「米国/東部」、「MET」などの名前付きタイムゾーンとして指定できます。

現在のセッションのタイム ゾーン設定は、ゾーンに依存する時間値の表示とstorageに影響します。これには、 NOW()CURTIME()などの関数によって表示される値が含まれます。

注記:

タイムゾーンの影響を受けるのは、タイムスタンプ データ型の値のみです。これは、Timestamp データ型がリテラル値 + タイム ゾーン情報を使用するためです。 Datetime/Date/Time などの他のデータ型にはタイム ゾーン情報がないため、その値はタイム ゾーンの変更の影響を受けません。

create table t (ts timestamp, dt datetime);
Query OK, 0 rows affected (0.02 sec)
set @@time_zone = 'UTC';
Query OK, 0 rows affected (0.00 sec)
insert into t values ('2017-09-30 11:11:11', '2017-09-30 11:11:11');
Query OK, 1 row affected (0.00 sec)
set @@time_zone = '+8:00';
Query OK, 0 rows affected (0.00 sec)
select * from t;
+---------------------|---------------------+ | ts | dt | +---------------------|---------------------+ | 2017-09-30 19:11:11 | 2017-09-30 11:11:11 | +---------------------|---------------------+ 1 row in set (0.00 sec)

この例では、タイム ゾーンの値をどのように調整しても、Datetime データ型の値は影響を受けません。ただし、タイムゾーン情報が変更されると、タイムスタンプ データ型の表示値も変わります。実際、storageに保存される値は変化せず、タイムゾーン設定の違いに応じて表示方法が異なるだけです。

注記:

  • タイム ゾーンは、タイムスタンプと日時の値の変換中に関係し、セッションの現在のtime_zoneに基づいて処理されます。
  • データ移行の場合、プライマリ データベースとセカンダリ データベースのタイムゾーン設定に特に注意する必要があります。

このページは役に立ちましたか?