🗽

SnowflakeのデフォルトのタイムゾーンがPDTで苦戦したお話

2022/05/25に公開

前置き

こんにちは。株式会社GENDAのこみぃです。

今日のお話は、データに関わる人なら結構頭を悩ませることが多いタイムゾーンについてのお話です。

データではタイムゾーンは超大切!

システムのタイムゾーンを把握しておくのはデータ基盤に限らず非常に大切なのですが、データにおいてはタイムゾーンを把握しておくのは特に非常に大切です。

理由は、 データを突合するときにタイムゾーンがズレているとエライことになる からです。

特に以下の2つのパターンのミスが起こりがちです。

データソースごとにタイムゾーンが違うことにより起こるミス

例えば日々の売上のデータと来客数のデータを集計してお客様一人あたりの売上というデータを作りたかったとしましょう。
ここで来客数と売上のデータのタイムゾーンが違うと正しいデータができません。

例えばUTCとJSTのデータが混在していた場合に5/27のお客様一人あたりの売上のデータを作っていると思ったら、以下のデータを割り算していましたなんてことが、割と頻繁に起こります。

  • 売上: 5/27 0:00 ~ 5/27 23:59
  • 来客数: 5/27 9:00 ~ 5/28 8:59

データ基盤では取得しているデータソースによってタイムゾーンが違ったりなどして、こういったミスが本当に本当に頻繁に起こります。大事なことなので2回言いました。

ミドルウェアのタイムゾーンが想定と違った場合に起こるミス

例えば前日の売上を早朝に集計しておくような定期処理を仕掛けていたとします。

snowflakeだとsnowflake taskなどで仕掛ける場合ですね。この場合以下のようなクエリを書くことになります。

select-current-date
SELECT
  a.soreppoi_date,
  a.soreppoi_int,
  a.soreppoi_string,
  b.soreppoi_user_data
from
  soreppoi_log a
  inner join
  soreppoi_user_master b
    on a.user_id = b.user_id
where
  date(soreppoi_date) = current_date;

システムのタイムゾーンがUTCだった場合にはこの処理は午前9時以前に実行すると思ったような結果になりません。
9時以前はUTCだとまだ前日 なので、一昨日のデータを集計してしまうのですね。

今日お話する件では、特にこちらのミスが多く発生します。

SnowflakeのデフォルトのタイムゾーンはPDT(米国太平洋標準時)

そんなわけでSnowflakeのタイムゾーンもしっかりと把握しておきましょう。

さてさて、マニュアルを見ましょうね。
https://docs.snowflake.com/ja/sql-reference/parameters.html#timezone

ん?

?????

タイムゾーンを変える方法

さて、接続のたびにタイムゾーンを指定したり、SQLの中で指定する方法もありますけれど、BIツールによっては設定できないこともあります。
なので、できればデフォルトをUTCかJSTにしたいですよね。

そんなときはAlterAccountで、アカウント単位でデフォルトを設定してしまえばOK
https://docs.snowflake.com/ja/sql-reference/sql/alter-account.html

alter-timezone
ALTER ACCOUNT SET TIMEZONE = 'UTC';

アカウント単位ではなくユーザー単位などでも設定可能ですが、日本で事業をしていて、デフォルトをPDTにしたい理由はあまりないと思いますので、アカウントごと設定で問題ないでしょう。

ちなみに PDTにはサマータイムが存在する ので日本人の思考の盲点をつくようなミスすら起こります。
おとなしくUTCかJSTに設定することを強くおすすめします。

結びの言葉

そういうわけで、本日はSnowflakeのちょっと不思議な仕様のお話をしました。

個人的にはグローバルなサービスはデフォルトはUTCに統一してほしいなあと思っていますが、そうじゃないこともあるので気をつけましょう!

さらに詳細が聞きたいという方は、私がわかる範囲であればお答えしますので、Twitterあたりでお気軽にお声がけください。
@kommy_jp

なお、株式会社GENDAでは、一緒に働くデータ関連の人材を絶賛募集中です。
興味がある方は是非お声がけください。
https://genda.jp/

本日はこのあたりで。
それじゃあ、バイバイ!

Discussion