ブログ

読んで思い出す。忘れるために書く

Ruby(google-cloud-bigquery)でDATE_ADD関数が使えない?

自回答の転記:

teratail.com

GCP ってナニ」「BigQuery ってナニ」状態から、でも実際にプロジェクト作成したり、API キー発行したりしつつ、調べてみた

短い答え

Legacy SQL で書く場合、 legacy_sql: true を設定するか、あるいは標準のSQL 構文に沿ったクエリを投げましょう

調べたこと

BigQuery には2種類の構文が存在している

  • Standard
  • Legacy

それぞれ構文が異なる部分があり、BigQuery 以外で使われている一般的なSQL 構文(SQL 2011 標準との互換性)で書けるため、Standard への移行を勧めている

たとえば DATE_ADD()

まず判り易いのが、受け付ける引数の数が3つ→2つに変わってる...!!

Legacy:

-- Timestamp 型で日付情報を受け、数値、単位で計算する
SELECT DATE_ADD(TIMESTAMP("2012-10-01 02:03:04"), 5, "YEAR")

Standard:

-- Date 型で日付情報を受け、INTERVAL と数値, 単位を指定することで計算する
SELECT DATE_ADD(DATE "2008-12-25", INTERVAL 5 DAY)

クエリ例(Legacy & Standard)

それぞれをRuby で書いた場合(クライアントのセットアップなどの記述は省略)

# Legacy SQL
query_string = %(SELECT
  DATE_ADD( TIMESTAMP('2012-10-01 02:03:04'), 5, 'YEAR'  ) AS MyDate
)

query_job = bigquery.query_job(query_string, legacy_sql: true)

# (結果の出力をするコードを書くと得られる値)
# => {:MyDate=>2017-10-01 11:03:04 +0900}
# Standard SQL
query_string = %(SELECT
  DATE_ADD( DATE(TIMESTAMP('2012-10-01 02:03:04')), INTERVAL 5 YEAR  ) AS MyDate
)

query_job = bigquery.query_job(query_string)

# (結果の出力をするコードを書くと得られる値)
# => {:MyDate=>2017-10-01 11:03:04 +0900}

Tips: %() 構文でクエリを記述すると、エスケープ処理を考えずに ', " が気兼ねなく使える

legacy_sql オプションについて

legacy_sql: true 指定ができるオプションに関しては、検索してると出てきたりする

Links