[Athena] 日付の絞り込みの場合、TIMESTAMP型にキャストする必要がある件

はじめに

仕事でAthenaを使いだして、MySQLとほとんど同じ書き方で動いてくれるので助かっていたのですが、date型カラムで絞り込みしたときに、少しハマったので共有します。

最後まで読んで頂けると嬉しいです。

いきなり結論

SELECT * FROM users WHERE created_at <= CAST('2020-10-01' AS TIMESTAMP);

上記の通りです。

では、簡単な内容ですが解説していきます。

解説

このテーブルは、よくあるユーザー管理のテーブルを想定しています。

今回のクエリ文だと、「テーブルにある全ユーザーのうち、2020年10月1日までに登録したユーザー情報を取得したい」場合とかですね。

MySQLの場合

MySQLだと下の感じでクエリを作って投げれば、想定通りの値が返ってきます。

SELECT * FROM users WHERE created_at <= '2020-10-01';

しかし、Athenaではdate型カラムを絞り込む場合、TIMESTAMP型にキャストしてWHEREする必要があります。

キャストせずに検索した際のエラー例

MySQLのようにクエリ文を書いた場合、下記のようなエラーが出ます。

Your query has the following error(s):

SYNTAX_ERROR: line 1:67: '<=' cannot be applied to date, varchar(10)

date型で保持しているのに、文字列10には対応してないよって言っている様子です。

さらっとですが解説は以上です。

おまけ: Data Wranglerで書いたら

ということで、よくあるData Wranglerで書いた例だとこんな感じになります。

query = f"SELECT * FROM users WHERE created_at <= CAST('{target_date}' as TIMESTAMP);"

df = wr.athena.read_sql_query(query)

CASTした上で、シングルクォーテーションで囲ってます。

これ忘れがちなので注意して下さい。

フォーマット済み文字列リテラルで書いてますけど、ここは.format()でも内部的には同じですね。

さいごに

今日は、Athenaのdate型カラムの絞り込みについて共有しました。

ツッコミや、何かご意見があれば、TwitterのDM等に頂けると嬉しいです!

最後までありがとうございました。

PON3

PON3

5年くらい前に、30代完全未経験から独学でWeb系のソフトウェアエンジニアになった人。 現在はフリーランスエンジニアとして、大阪の自宅からフルリモートで東京の自社開発企業のお仕事をしている。 主戦場はバックエンドで、Go言語でのAPI開発や、Pythonでのデータ分析が武器。 とは言いつつ、フロントエンドをSPAを実装したり、IaCでクラウドインフラの設計構築したり、スクラム開発でプロジェクト運営したりするなんでも屋。 いつも、ググってきては誰かが書いてくれた記事を見て開発していたが、もらってばかりでなく世の中に返すこともしたいと思い、技術ブログをはじめる。 妻と2歳になる娘の3人暮らし。 何かご用件がある方は、TwitterのDMからどうぞ。