【SQL】BigQueryにおける日時を表すデータ型の種類をわかりやすく解説

BigQueryにおいて日時を表すデータ型はいくつかあるが、混乱しがちだ。

今回は私個人の備忘録を含めて、日時を表すデータ型について整理したいと思う。

日時を表すデータ型一覧

BigQueryにおいて日時を表すデータ型は下記4つある。

  • TIMESTAMP型:タイムスタンプ型
  • DATE型:日付型
  • DATETIME型:日時型
  • TIME型:時間型

特に赤字のTIMESTAMP型とDATE型がよく使われるので、この2つは明確に理解しておきたい。

それぞれの特徴を整理した表が下記だ。
BQ 日時型
日時を表すデータ型を深く理解するためにはタイムゾーンについて把握しておく必要がある。

スポンサーリンク

タイムゾーンとは?

タイムゾーンとは共通の標準時を使う地域や区分のことだ。
※標準時とはある国家や地域が共通で使う時刻。

世界の基準となる時刻のことを協定世界時(UTC)と呼び、各地域のタイムゾーンの時刻はUTCとの時差で定義されている。

例えば、日本においてはUTC(協定世界時)に9時間を足した「日本標準時」(JST)が使われている。

タイムゾーンは、カレンダーや時計に表示される日時(時計を見て確認できる時間)からタイムスタンプ(絶対時間)へ、またはその逆に変換されるときに使用される。

そのため、BigQueryにおいて日時データを取り扱う時はこのタイムゾーンを考慮する必要があるのだ。

スポンサーリンク

TIMESTAMP型

TIMESTAMP型とは、絶対的な時刻(UTC)を表すデータ型だ。

TIMESTAMP型を使うと、例えば、2022-12-01-09:00:00  のように表示されるが、2022年12月1日9時00分00秒という意味だ。

TIMESTAMP型のタイムゾーンはUTC(協定世界時)で表されるのが基本だが、他のタイムゾーン(日本のJSTなど)を指定して変換することも可能だ。

前述したとおり、UTCと日本の標準時であるJSTは9時間ずれがあるので、下記は同じ時刻を指している。

BQ日時型②

実務においては、このTIMESTAMP型からDATE型に変換することが多いが、DATE型はタイムゾーンの情報を持たない。

そのため、TIMESTAMP型からDATE型に変換する場合は「どのタイムゾーンの日付なのか?」を指定してあげる必要があるので、要注意だ。

BigQueryのデフォルトのタイムゾーンは UTCなので、データのアップロードをする際は注意が必要だ。

JST(日本の標準時)の日時データをそのままTIMESTAMP 型でアップロードするとタイムゾーンがUTCになってしまうからだ。

そのため、日時データをTIMESTAMP 型でアップロードする場合はロード前にタイムゾーンの情報を付与するか、後述するDATETIME型に変換しておく必要があるのは覚えておきたい。

DATE型

DATE型は日付に関する情報を持っているデータ型だ。

例えば、2022年12月1日9時00分00秒はDATE型で表示すると2022-12-01 という形で日付のみが表示される。

実務において時間データまでは必要なく、日付データがあれば目的を果たせる、というデータは多いので、DATE型がよく使われる。

ただ前述したとおり、DATE型はタイムゾーンの情報を持たないので、TIMESTAMP型からDATE関数等で変換する時はタイムゾーンを指定してあげる必要がある。

DATETIME型

DATETIME型は日付と時間に関する情報を持っているデータ型だ。

例えば、2022年12月1日9時00分00秒はDATETIME型で表示すると2022-12-01 という形で日付のみが表示される。

前述したTIMESTAMP型とDATETIME型はどちらも日付も時刻も表しているので

「同じじゃないの?」

と疑問を持つ人も多いと思う。

結論から言うと、TIMESTAMP型とDATETIME型の違いはタイムゾーンの情報を持つかどうかだ。

TIMESTAMP型とDATETIME型でそれぞれ2022年12月1日9時00分00秒を表してみる。

上記クエリを実行した結果が下記だ。

BQ日付型③

TIMESTAMP 型とDATETIME型で表記が微妙に違っているのがお分かりいただけると思う。

TIMESTAMP型はタイムゾーンが定義されていて、前述したUTC(世界標準時)を基準とした日時の管理がされている。

タイムゾーンを指定すれば、日本の標準時(JST)に変えることも出来るし、他の国のタイムゾーンに変えることも出来る。

一方でDATETIME型はタイムゾーンの情報を持たない。

例えば、2022-12-01-09:00:00 という値は2022年12月1日9時という意味だが、どのタイムゾーンの時間なのかはDATETIME型では表していないということだ。

そのため、JST(日本の標準時)の2022年12月1日9時かもしれないし、UTC(協定世界標準時)の2022年12月1日9時かもしれないが、DATETIME型ではその情報は持っていないということだ。

TIME型

TIME型は時間に関する情報を持つデータ型だ。

特定の日付とは関係なく、時刻のみを表す。

上記クエリを実行してTIME型のデータを表すと下記のように時刻のみが表される。

BQ日付型④

このTIME型データもTIMESTAMP型と違い、タイムゾーンの情報は持たない。

もし絶対的な時刻を表したい場合はTIMESTAMP型を使う必要がある。

まとめ

今回はBigQueryにおける日時を表す4つのデータ型を解説した。

BQ 日時型

それぞれのデータ型の特徴を把握して、うまく使いこなせるようにしていきたい。

 

おすすめの記事