28

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

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

ここにタイムゾーン変換関数が表示されません:

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

4

7 に答える 7

39

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タイムゾーン名またはオフセットを使用できます。

于 2017-04-11T14:45:08.223 に答える
29

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

BigQueryDATEドキュメント

于 2016-10-19T19:51:54.960 に答える
5

ここでつまずく人へ:

タイムスタンプを別のタイムゾーンに変換するにはどうすればよいですか?

作成されたTIMESTAMP値はUTCとして保存され、TIMESTAMPにはコンストラクター(TIMESTAMP、STRING)がない場合、タイムスタンプを最初にDATETIMEに変換してから、から新しいTIMESTAMPを作成することにより、タイムスタンプを別のタイムゾーンに変換できます。新しいタイムゾーンのDATETIME:

SELECT TIMESTAMP(DATETIME(timestamp_field, '{timezone}'))

例:

SELECT
    input_tz,
    input,
    'America/Montreal' AS output_tz,
    TIMESTAMP(DATETIME(input,'America/Montreal')) AS output
FROM (
    SELECT 'US/Pacific' AS input_tz, TIMESTAMP(DATETIME(DATE(2021, 1, 1), TIME(16, 0, 0)), 'US/Pacific') AS input
    UNION ALL
    SELECT 'UTC' AS input_tz, TIMESTAMP(DATETIME(DATE(2021, 1, 1), TIME(16, 0, 0)), 'UTC') AS input
    UNION ALL
    SELECT 'Europe/Berlin' AS input_tz, TIMESTAMP(DATETIME(DATE(2021, 1, 1), TIME(16, 0, 0)), 'Europe/Berlin') AS input
) t

結果:

input_tz 入力 output_tz 出力
1 米国/太平洋 2021-01-02 00:00:00 UTC アメリカ/モントリオール 2021-01-01 19:00:00 UTC
2 UTC 2021-01-01 16:00:00 UTC アメリカ/モントリオール 2021-01-01 11:00:00 UTC
3 ヨーロッパ/ベルリン 2021-01-01 15:00:00 UTC アメリカ/モントリオール 2021-01-0110:00:00 UTC

DATETIME値からタイムゾーン情報を取り除く方法は?

BigQueryのDATETIMEはタイムゾーンが単純であるため、タイムゾーン情報は含まれていません。そうは言っても、DATETIMEのタイムゾーンを知ることができるビジネス知識がある場合は、既知のタイムゾーンを持つTIMESTAMPに変換することで、そのタイムゾーンオフセットを取り除くことができます。

SELECT TIMESTAMP(datetime_value, '{timezone}')

TIMESTAMPが値をUTCで保存することを考えると、それが好ましい保存方法である場合はDATETIMEに再変換できますが、これでDATETIMEがUTCであることがわかります:)

うまくいけば、これが役立つことがあります!:)

于 2021-07-01T20:42:10.673 に答える
4

あなたの前提は正しいです。このようにグループ化すると、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

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

于 2012-09-19T18:32:37.403 に答える
3

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


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

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

于 2012-09-18T18:32:52.333 に答える
3

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

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

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

ここでPARSE_TIMESTAMPは、IST文字列をUTC TIMESTAMP(文字列ではない)に解析します。プレフィックスとして追加するSAFEと、エラー/ヌルなどが処理されます。

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

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

この例では、形式のIST文字列を取得し、Fri May 12 09:45:12 IST 2019それをに変換し12-May-2019 04:15:12 UTCます。

ISTを必要なTimeZoneおよびAsia/Kolkata関連するタイムゾーン名に置き換えて、タイムゾーンの変換を実現します

于 2019-08-13T07:07:16.120 に答える
-2

TIMESTAMP_SUBTIMESTAMP_ADD関数がその仕事をしました。タイムスタンプをUTCからPSTに変換する必要がある場合は、次を使用しました。

TIMESTAMP_SUB(`timestamp`, INTERVAL 8 HOUR)
于 2021-03-31T11:21:22.480 に答える