RedShift におけるユニバーサルタイム対応の定石

世間ではサマータイム導入の話題が上がってますが、それはともかく…。

いつでも国際化できるように、データベースに保存するデータは、常にユニバーサルタイムに対応するようにしています。

RedShift には timestamp with time zone 型がありますので、これを使います。タイムゾーン付きですが、 UTC しか格納できません。

create table sometable (
    created_at timestamp with time zone,
    sales bigint
);

select する時には注意が必要で、フィルターは JST -> UTC への変換を行い、表示データは逆に UTC -> JST への変換を行います。そして convert_timezone は timestamp with time zone に対応してないため timestamp にキャストする必要もあります。

select convert_timezone('UTC', 'Asia/Tokyo', created_at::timestamp) created_jst, sales
from sometable
where created_at >= convert_timezone('Asia/Tokyo', 'UTC', '2018-06-01')
  and  created_at < convert_timezone('Asia/Tokyo', 'UTC', '2018-07-01');

日毎の集計はこんな感じになります。

select convert_timezone('UTC', 'Asia/Tokyo', created_at::timestamp)::date target_date, sum(sales) day_sales
from sometable
where created_at >= convert_timezone('Asia/Tokyo', 'UTC', '2018-06-01')
  and  created_at < convert_timezone('Asia/Tokyo', 'UTC', '2018-07-01')
group by target_date
order by target_date;

日常的にこのような実装にしておけば、万が一のサマータイムも怖くありません。(笑)

links

social