web-dev-qa-db-ja.com

BigQueryが別のタイムゾーンに変換する

私はグーグルビッグクエリのunixtimestampにデータを保存しています。ただし、ユーザーがレポートを要求する場合、ローカルタイムゾーンでデータをフィルタリングおよびグループ化する必要があります。

データはGMTで保存されます。ユーザーはESTでデータを見たいと思うかもしれません。レポートでは、データを日付でグループ化するように求められる場合があります。

タイムゾーン変換関数が表示されない こちら

Bigqueryでこれを行う方法を誰かが知っていますか?つまり、タイムスタンプを別のタイムゾーンに変換した後でグループ化するにはどうすればよいですか?

16
akshah123

2016年の更新以下の回答をご覧ください。BigQueryがタイムスタンプとタイムゾーンのメソッドを提供するようになりました


その通りです。BigQueryはタイムスタンプ変換メソッドを提供していません。

この場合は、GMT/UTCタイムスタンプフィールドのディメンションに基づいてGROUP BYを実行し、結果をコードのローカルタイムゾーンに変換して表示することをお勧めします。

4

2016年9月の時点で、BigQueryは標準SQLを採用しており、「DATE(timestamp、timezone)」関数を使用してタイムゾーンをオフセットできるようになりました。ここでそれらのドキュメントを参照できます。

BigQuery日付ドキュメント

22
milyord

BigQueryの標準SQLには 組み込み関数

DATE(timestamp_expression, timezone)
TIME(timestamp, timezone)
DATETIME(timestamp_expression, timezone)

例:

SELECT 
   original,
   DATETIME(original, "America/Los_Angeles") as adjusted
FROM sometable;

+---------------------+---------------------+
| original            | adjusted            |
+---------------------+---------------------+
| 2008-12-25 05:30:00 | 2008-12-24 21:30:00 |
+---------------------+---------------------+

標準の IANAタイムゾーン名またはオフセット を使用できます。

15
Mani Gandham

あなたの前提は正しいです。このようにグループ化すると、ESTまたはEDTを必要とするユーザーは誤った日付のグループを取得します。

GROUP BY UTC_USEC_TO_DAY(ts_field)

ただし、ユーザーが必要とするオフセットを把握している限り、サーバーで完全な計算を行うことができます。たとえば、ESTがUTCから5時間遅れている場合、次のようにクエリします。

GROUP BY UTC_USEC_TO_DAY(ts_field - (5*60*60*1000*1000000) )

"5"をパラメータにして、オフセットを時間単位で指定するだけです。以下は、サンプルデータセットの1つに基づくサンプルです。

SELECT
  COUNT(*) as the_count,
  UTC_USEC_TO_DAY(timestamp * 1000000 - (5*60*60*1000*1000000) ) as the_day
FROM
  [publicdata:samples.wikipedia]
WHERE
  comment CONTAINS 'disaster'
  and timestamp >= 1104537600
GROUP BY
  the_day
ORDER BY
  the_day

オフセットを削除して、一部の編集が別の日に移動する様子を確認できます。

4
mdahlman

TimeZone DateTime文字列をUTCに変換するには、TIMESTAMPでサポートされているBigQuery形式を使用してPARSE_TIMESTAMPを使用できます。

たとえば、IST(インド標準時)文字列をUTCに変換するには、以下を使用します。

SAFE.PARSE_TIMESTAMP("%a %b %d %T IST %Y", timeStamp_vendor, "Asia/Kolkata")

ここでPARSE_TIMESTAMPは、IST文字列をUTC TIMESTAMP(文字列ではない)に解析します。接頭辞としてSAFEを追加すると、エラー/ nullなどが処理されます。

これをBigQueryの読み取り可能な文字列形式に変換するには、次のようにFORMAT_TIMESTAMPを使用します。

FORMAT_TIMESTAMP("%d-%b-%Y %T %Z", SAFE.PARSE_TIMESTAMP("%a %b %d %T IST %Y", timeStamp_vendor, "Asia/Kolkata"))

この例では、Fri May 12 09:45:12 IST 2019という形式のIST文字列を受け取り、12-May-2019 04:15:12 UTCに変換します。

ISTを必要なTimeZoneに置き換え、Asia/Kolkataを適切なタイムゾーン名に置き換えて、タイムゾーンの変換を実現します

1
Nishant