今回はMYSQLで日付や時刻関数を使った時に、
何故か9時間ずれていたのを対応したログです。
MYSQLで
SELECT now( ) ; を実行したときに
2008-02-15 15:54:15 と返ってきて欲しいのに、
2008-02-15 06:54:15 と9時間ずれて返ってくる環境がありました。
早速ググったところ、以下のページで解決策がHITしました。
MySQL Lists: mysql-ja: 時間関数: 4.1の新しい機能の1つ
半分より少し下のところにあるように
SUPER の権限を持つユーザはグローバルの値をランタイム
にセットできます。これにはSET GLOBAL time_zone ステートメント
を以下のように使います。
mysql> SET GLOBAL time_zone = timezone;
それぞれのクライアントはダイナミックなtime_zone
セッション変数で指定されたそれぞれのタイムゾーンのセッティング
をもっています。この変数の初期値はグローバルなtime_zone 変数
と同じです。しかし、ランタイムでもSET time_zoneステートメント
で設定しなおしが効きます。
mysql> SET time_zone = timezone;
にセットできます。これにはSET GLOBAL time_zone ステートメント
を以下のように使います。
mysql> SET GLOBAL time_zone = timezone;
それぞれのクライアントはダイナミックなtime_zone
セッション変数で指定されたそれぞれのタイムゾーンのセッティング
をもっています。この変数の初期値はグローバルなtime_zone 変数
と同じです。しかし、ランタイムでもSET time_zoneステートメント
で設定しなおしが効きます。
mysql> SET time_zone = timezone;
このクエリを実行すれば良いらしいって事は分かったんですが、
timezone の部分はどうやって書くの?
って思っても一回よく読んだらちゃんと書いてありました。
1. UTCからのオフセットを指定するストリングとして、例えば
'-7:00'のような'[+|-]HH:MM'な形式でタイムゾーンはUTCより
7時間前(マウンテン時間)であることを示します。この方法は
何時も有効です、OSに関わらずまたタイムゾーンテーブルが
設定されていなくても。
'-7:00'のような'[+|-]HH:MM'な形式でタイムゾーンはUTCより
7時間前(マウンテン時間)であることを示します。この方法は
何時も有効です、OSに関わらずまたタイムゾーンテーブルが
設定されていなくても。
つまり
mysql> SET GLOBAL time_zone = '-7:00';
mysql> SET time_zone = '+9:00';
mysql> SET time_zone = '+9:00';
といったように使うって事で納得。
で、SQLを実行するときだけタイムゾーンを変更したいときや、
SUPERな権限が無い場合は
SET time_zone = '+9:00';
のクエリを実行してから now() などの関数を使う。
# 以下テスト結果 #
テスト前の環境は日本なのでタイムゾーンは +9:00です。
2008-02-15 16:15:00 頃が現在時刻です。
SET time_zone = '-7:00';
SELECT now( ) ;
戻り値 → 2008-02-15 00:17:50
SELECT now( ) ;
戻り値 → 2008-02-15 00:17:50
この場合、クエリ終了後にもう一回
SELECT now( ) ; をすると
戻り値 → 2008-02-15 16:18:26
とグローバルのタイムゾーンで返ってきます。
一方SUPERな権限を持っている場合はグローバルのタイムゾーンを変更できる。
SET GLOBAL time_zone = '-7:00';
SELECT now( ) ;
戻り値 → 2008-02-15 00:20:28
SELECT now( ) ;
戻り値 → 2008-02-15 00:20:28
以後何度 SELECT now( ) ;
を行っても同じタイムz-ンの値が返ってきます。
戻す場合は
SET GLOBAL time_zone = '元のタイムゾーン';
で。
スポンサーリンク