KAKIMASSE

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

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

      2011/01/12

久々のエントリーです。
今回は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 = '元のタイムゾーン';
で。

 - MYSQL

SPONSORD LINKS

スポンサーリンク

スポンサーリンク

Message

メールアドレスが公開されることはありません。

  関連記事

no image
MYSQL:No mysqld pid file found. Looked for ・・・ の対処方法

Vine Linux 3.3の環境のサーバでmy.cnfに変更を加えてMYSQL ...