Amazon RDS(PostgreSQL)でTimezoneを変更する

postgresqlAmazon RDS が PostgreSQL にも対応した
デフォルトでは log_timezone/TimeZone ともに UTC で変更可能なのは後者のみとなっている。
Parameter Groups を追加して TimeZone を変更する方法をメモ。

デフォルトのタイムゾーン

デフォルト設定で PostgreSQL インスタンスを作成した時のタイムゾーンを確認。

tztest=> show timezone;
 TimeZone
----------
 UTC
(1 row)

tztest=> select now();
              now
-------------------------------
 2013-11-17 14:01:46.534238+00
(1 row)

Web 管理画面の DB Parameter Groups>default.postgres9.3 で Timezone 関連の設定を確認すると、ログ向け(log_timezone)・表示向け(timezone)ともにデフォルトの Timezone は UTC。表示向けの Timezone は Modifiable 扱い。

rds_postgresql_default_setting

タイムゾーンを変更

Timezone を変更するには Parameter Groups を新規登録し、パラメーター timezone を変更する。

rds_postgresql_timezone_setting

この Parameter Groups を PostgreSQL インスタンスに設定すれば、変更したタイムゾーンが利用されるようになる。
日本の場合は Japan や Asia/Tokyo などで指定可能。

tztest=> show timezone;
 TimeZone
----------
 Japan
(1 row)

tztest=> select now();
              now
-------------------------------
 2013-11-17 23:25:39.641463+09
(1 row)

タイムゾーンを変更するとタイムスタンプはどう変わるのか?

デフォルト値が with time zone と without time zone の2種類の timestamp カラムを持ったテーブルを作成。

CREATE TABLE foo (
  id               integer,
  with_timezone    timestamp with time zone default now(),
  without_timezone timestamp without time zone default now()
);

タイムゾーンが UTC の状態でレコードを挿入し、現在時刻のタイムスタンプを設定させる。

tztest=> insert into foo(id) values(1);
INSERT 0 1
tztest=> select * from foo;
 id |        with_timezone         |     without_timezone
----+------------------------------+---------------------------
  1 | 2013-11-17 23:12:50.02413+09 | 2013-11-17 14:12:50.02413
(1 rows)

次に、上記手順でタイムゾーンを Japan に変更後、レコードを挿入する。

tztest=> insert into foo(id) values(2);
INSERT 0 1
tztest=> select * from foo;
 id |        with_timezone         |     without_timezone
----+------------------------------+---------------------------
  1 | 2013-11-17 23:12:50.02413+09 | 2013-11-17 14:12:50.02413
  2 | 2013-11-17 23:26:03.62492+09 | 2013-11-17 23:26:03.62492
(2 rows)

with timezone のタイムスタンプはタイムゾーン情報も持っているので、タイムゾーン変更後は変更後のタイムゾーンに補正した時刻が表示される。
一方で without timezone(default) のタイムスタンプはタイムゾーン情報を持っていないため、挿入した時の時刻が使いまわされている。

See Also

Advertisements
Tagged with: , , ,
Posted in database

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
%d bloggers like this: