blogですかい

仕事、プライベートで学んだことなどを発信し、その内容がたとえ少数でも誰かの役に立ったらなら、それはとっても嬉しいなって

Amazon RDSのMySQLインスタンスでJSTの時刻を使う方法

RDSのMySQLインスタンスタイムゾーンの設定をすることができず、UTC固定です。 AWSの管理上の都合らしいです。

UPDATE `table_name` SET `dt_column`=NOW() WHERE `id`=1;

といったようなクエリを実行すれば、dt_columnフィールドにはUTCの時刻が入ります。

日本時間を登録するにはどうすれば良いか

ADDDATE(), ADDTIME()等の関数を使う

例えば

UPDATE `table_name` SET `dt_column`=ADDTIME(NOW(), '09:00:00') WHERE `id`=1;
UPDATE `table_name` SET `dt_column`=ADDDATE(NOW(), INTERVAL 9 HOUR) WHERE `id`=1;
UPDATE `table_name` SET `dt_column`=NOW() + INTERVAL 9 HOUR WHERE `id`=1;

アプリサーバの時刻を使用する(アプリサーバのタイムゾーンが正しく設定されている前提で)

例えばPHPなら

<?php
$datetime = date('Y-m-d H:i:s');
$sql = "UPDATE `table_name` SET `dt_column`='{$datetime}' WHERE `id`=1 ";

セッションのtime_zone変数の値を変える

MySQLのtime_zone変数はGLOBALスコープのものとSESSIONスコープのものがあり、SESSIONスコープのものであればユーザ側で変更することができます。

MySQL [(none)]> SELECT @@session.time_zone;
+---------------------+
| @@session.time_zone |
+---------------------+
| UTC                 |
+---------------------+
1 row in set (0.00 sec)

MySQL [(none)]> SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2013-09-25 02:59:44 |
+---------------------+
1 row in set (0.04 sec)

MySQL [(none)]> SET SESSION time_zone = 'Asia/Tokyo';
Query OK, 0 rows affected (0.10 sec)

MySQL [(none)]> SELECT @@session.time_zone;
+---------------------+
| @@session.time_zone |
+---------------------+
| Asia/Tokyo          |
+---------------------+
1 row in set (0.00 sec)

MySQL [(none)]> SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2013-09-25 12:00:42 |
+---------------------+
1 row in set (0.00 sec)

アプリ側でサーバ接続直後に SET SESSION time_zone = 'Asia/Tokyo'; を実行するか、サーバ側でストアドプロシージャを作成し、クライアントからの接続があった時に自動で実行するようにセットしておけば、DMLを書き換えること無く対応ができる。

ストアドプロシージャを使う方法はこちらが参考になります。 http://techfun.cc/aws/aws-rds-timezone.html