📚

Amazon Athena, BigQuery, SnowflakeにおけるDATE型の範囲の違い

2024/02/25に公開

この記事で言いたいことは次のツイートに集約されています。

https://x.com/ohsawa0515/status/1760931874187440183

ことの発端

Amazon AuroraのデータをPARQUET形式で出力されていたものをAmazon Athenaでクエリしていたのですが、BigQueryに移行することになり、そのままロードしようとしたところDATE型のカラムでエラーが発生しました。

調べてみると、そのカラム(Birthday)にはマイナス日付(例:-0001-12-30)が入っていたのが原因でした。結局マイナス日付はダンプしたときのバグだったようで解消されましたが、他にも 0000-12-309999-02-27 みたいな値が入っていてそれらは問題なくクエリできていました。

誕生日なのに明らかにおかしい日付が入っているのは目をつむるとして、それぞれのDWHでDATE型の範囲がどのように定義されているのかが気になったので調べてみました。

BigQuery

BigQueryのDATE型は 0001-01-01 から 9999-12-31 と決められています。

https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#date_type

もしも日付データを文字列で持っていて、DATE型に変換するときは SAFE_CAST 関数を使うと変換に失敗したときに NULL を返してくれます。

bigquery

Snowflake

SnowflakeのDATE型はとれる範囲はドキュメントに書かれておらず、マイナス日付の挙動については記載はありませんでした。
年は1582と9999の間をとることを推奨するとのことでした。

https://docs.snowflake.com/ja/sql-reference/data-types-datetime#date

マイナス日付をいれると、なぜか 2001年に変換されました。

snowflake

Amazon Athena

Amazon AthenaおよびPrestoにはDATE型の範囲については記載がありませんでした。

https://docs.aws.amazon.com/athena/latest/ug/data-types.html

https://prestodb.io/docs/current/language/types.html#date

マイナス日付も問題なくクエリできてしまいました。

athena

マイナスの日付とは何か?

マイナス日付というのは紀元前の日付を表すものだそうです。

https://ja.wikipedia.org/wiki/紀元前

こちらの記事によると、各RDBにおいてもDATE型の範囲は異なり、Oracleは紀元前の場合はマイナスで表現するとのことです。

https://www.idearu.info/article/data/ds1116

まとめ

各種DWHおよびRDBにおけるDATE型の範囲について調べてみました。日付にマイナスを入れること自体は要件によりますがありえる話だといえます。

ただ、今回のケースだと誕生日のカラムなので明らかにマイナスの値が入るのはおかしいため、前処理で除外するべきだといえるでしょう。

Discussion