fc2ブログ

ネットで見つけた面白い記事や、役立つのではと感じたネタなどを書いています。

MYSQL:NOW()やSYSDATE()で返ってくるタイムゾーンを変更したい

久々のエントリーです。

今回は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;


このクエリを実行すれば良いらしいって事は分かったんですが、
timezone の部分はどうやって書くの?
って思っても一回よく読んだらちゃんと書いてありました。

1. UTCからのオフセットを指定するストリングとして、例えば
'-7:00'のような'[+|-]HH:MM'な形式でタイムゾーンはUTCより
7時間前(マウンテン時間)であることを示します。この方法は
何時も有効です、OSに関わらずまたタイムゾーンテーブルが
設定されていなくても。

つまり
mysql> SET GLOBAL time_zone = '-7: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 16:18:26
とグローバルのタイムゾーンで返ってきます。

一方SUPERな権限を持っている場合はグローバルのタイムゾーンを変更できる。
SET GLOBAL time_zone = '-7:00';
SELECT now( ) ;
戻り値 → 2008-02-15 00:20:28

以後何度 SELECT now( ) ;
を行っても同じタイムz-ンの値が返ってきます。

戻す場合は
SET GLOBAL time_zone = '元のタイムゾーン';
で。

スポンサーリンク

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://sf51.blog42.fc2.com/tb.php/13-96d7d1cc
この記事にトラックバックする(FC2ブログユーザー)