date型のカラムに対してbetween等の比較演算子を使って範囲を絞りたい。
データベース(DB)に日付データを格納していたら出てきそうな要望である。
GoogleのBigQuery(通称「BQ」)はデータ分析によく使われるが、同じように日付のフィルタをかけたい場合があるだろう。
しかしここで問題が出てくる。
date型はDBによって扱い方が異なる。
同じ事をしたくてもSQLの書き方がDB毎に違うのだ。
なので今回は「BigQueryでdate型のカラムをbetween等で比較する方法」を解説する。
この記事を書いている人
記事を読むメリット
BigQueryでdate型のカラムをbetween等で比較する方法
BigQueryでdate型のカラムをbetween等で比較する方法は簡単だ。
そのまま日付の文字列と比較すればいい。
select * from dataset_name.table_name where date_column between "2020-09-01" and "2020-10-01"
以前はDATE関数を使う必要があった?
以前はdate型と文字列の比較はエラーになっていて、DATE関数で変換する必要があったという記述もある。
NGパターン
SELECT * FROM dataset.table_name WHERE Date = "2016-07-11" Argument type mismatch in function EQUAL: 'Date' is type int32, '2016-07-11' is type string
OKパターン
SELECT * FROM dataset.table_name WHERE DATE(Date) = "2016-07-11"
ただベストアンサーを見ると、エラー原因は「予約語をカラム名に使用しているから」とされており、予約語を使っていなければDATEでの変換も不要とのこと。
他のDBでは
BQではdate型は文字列で比較できたが、他のDBではどうだろうか。
では別のDBではどうなのだろうか。
select sysdate from dual where sysdate between to_date('2020-09-01', 'yyyy-mm-dd') and to_date('2020-10-11', 'yyyy-mm-dd')
select sysdate from dual where sysdate between '2020-09-01' and '2020-10-11'
BigQueryでdate型のカラムをbetween等で比較する方法 まとめ
BigQueryでdate型のカラムをbetween等で比較する方法は、"2020-10-05"のような日付フォーマットの文字列と比較すればよい。
MySQLも同様だが、Oracleもシングルクオートを使って'2020-10-05'のような文字列と比較できる。
結論としては、全部日付フォーマットの文字列との比較でよかった。
他にもgsutilのエラーや、スプレッドシートなどのGSuiteのサービスでデータが更新できない場合の記事などがあるので、気になったら見て欲しい。