私はグーグルビッグクエリのunixtimestampにデータを保存しています。ただし、ユーザーがレポートを要求する場合、ローカルタイムゾーンでデータをフィルタリングおよびグループ化する必要があります。
データはGMTで保存されます。ユーザーはESTでデータを見たいと思うかもしれません。レポートでは、データを日付でグループ化するように求められる場合があります。
タイムゾーン変換関数が表示されない こちら :
Bigqueryでこれを行う方法を誰かが知っていますか?つまり、タイムスタンプを別のタイムゾーンに変換した後でグループ化するにはどうすればよいですか?
2016年の更新:以下の回答をご覧ください。BigQueryがタイムスタンプとタイムゾーンのメソッドを提供するようになりました。
その通りです。BigQueryはタイムスタンプ変換メソッドを提供していません。
この場合は、GMT/UTCタイムスタンプフィールドのディメンションに基づいてGROUP BYを実行し、結果をコードのローカルタイムゾーンに変換して表示することをお勧めします。
2016年9月の時点で、BigQueryは標準SQLを採用しており、「DATE(timestamp、timezone)」関数を使用してタイムゾーンをオフセットできるようになりました。ここでそれらのドキュメントを参照できます。
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タイムゾーン名またはオフセット を使用できます。
あなたの前提は正しいです。このようにグループ化すると、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
オフセットを削除して、一部の編集が別の日に移動する様子を確認できます。
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
を適切なタイムゾーン名に置き換えて、タイムゾーンの変換を実現します