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
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 6 months ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 6 months ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 6 months ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 1 year ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 1 year ago
%d bloggers like this: