2017-01-10 19 views
2

私はGoogleのdocumentationを複数回試しましたが、UTCのタイムスタンプを異なるタイムゾーンに変換する単純な関数(SELECTクエリ内)が見つからないようです私の場合は太平洋です。ほとんどの国際タイムゾーンでは、単にオフセット時間を減算/追加するのにTIMESTAMP_SUBまたはTIMESTAMP_ADDを使用できますが、米国では夏時間を使用すると不必要に複雑になります。BigQueryでタイムスタンプを別のタイムゾーンに変換する

ドキュメントに何か紛失しましたか?または、別のタイムゾーンに簡単に変換するための他の方法がありますか?

答えて

2

TIMESTAMPタイプはUTCに関連付けられています。あなたは、このようなSTRINGDATE、またはDATETIMEなどの特定の時間帯に縛られていない他のいくつかのタイプにTIMESTAMPを変換するときは、例えば、変換のためのタイムゾーンを指定することができます。

SELECT EXTRACT(DATE FROM CURRENT_TIMESTAMP() 
       AT TIME ZONE 'America/Los_Angeles') AS current_pst_day; 

あなたがしたい場合異なるタイムゾーン間の時間の(現在の)番号、あなたは異なるタイムゾーンにCURRENT_DATETIME()を使用して違い取ることができます:相殺をより便利にするために

SELECT 
    time_zone, 
    DATETIME_DIFF(CURRENT_DATETIME(time_zone), 
       CURRENT_DATETIME(), HOUR) AS hours_from_utc 
FROM UNNEST(['America/Los_Angeles', 'America/New_York']) AS time_zone; 
+---------------------+----------------+ 
| time_zone   | hours_from_utc | 
+---------------------+----------------+ 
| America/Los_Angeles | -8    | 
| America/New_York | -5    | 
+---------------------+----------------+ 

を、あなたは追加するためにそれを呼び出して、SQL関数にこれをラップすることができます特定のタイムスタンプへのオフセット:

CREATE TEMP FUNCTION OffsetForTimeZone(t TIMESTAMP, time_zone STRING) AS (
    TIMESTAMP_ADD(t, INTERVAL DATETIME_DIFF(CURRENT_DATETIME(time_zone), 
              CURRENT_DATETIME(), HOUR) HOUR) 
); 

SELECT OffsetForTimeZone(CURRENT_TIMESTAMP(), 'America/Los_Angeles'); 

は、太平洋時間の間の電流の差によってオフセットとはいえ、この結果は、まだUTCに縛らTIMESTAMPであることに留意してください。

+0

私はSQL/BigQueryのnewbですので、クエリ内に独自の関数を記述することもできませんでした。 Googleがこれを組み込み関数として追加しない限り、これは行わなければならないと思う。 – dnaeye

+1

追加するだけで、文字列を返し、タイムゾーンを処理できる 'format_timestamp'もあります - https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#format_timestamp –

1

エリオットの答えに補遺として、私はタイムゾーンの数学は、夏時間の変更を中心に働いていたかどうかをテストしたかった:

#standardSQL 
WITH dates AS (
    SELECT TIMESTAMP('2015-07-01') x, 'summer' season 
    UNION ALL SELECT TIMESTAMP('2015-01-01') x, 'winter' season 
) 

SELECT 
    season, 
    time_zone, 
    DATETIME_DIFF(DATETIME(x, time_zone), 
       DATETIME(x), HOUR) AS hours_from_utc 
FROM UNNEST(['America/Los_Angeles', 'America/New_York']) AS time_zone 
CROSS JOIN dates 
ORDER BY 1,2 

それがない:

+--------+---------------------+----------------+ 
| season |  time_zone  | hours_from_utc | 
+--------+---------------------+----------------+ 
| summer | America/Los_Angeles |    -7 | 
| summer | America/New_York |    -4 | 
| winter | America/Los_Angeles |    -8 | 
| winter | America/New_York |    -5 | 
+--------+---------------------+----------------+ 

それはチリがなかったことにも注意してくださいだが2015年にDSTを実行:

#standardSQL 
WITH dates AS (
    SELECT TIMESTAMP('2014-07-01') x 
    UNION ALL SELECT TIMESTAMP('2015-07-01') x 
    UNION ALL SELECT TIMESTAMP('2016-07-01') x 
) 

SELECT 
    EXTRACT(YEAR FROM x), 
    time_zone, 
    DATETIME_DIFF(DATETIME(x, time_zone), 
       DATETIME(x), HOUR) AS hours_from_utc 
FROM UNNEST(['Chile/Continental', 'America/New_York']) AS time_zone 
CROSS JOIN dates 
ORDER BY 2,2 


+------+-------------------+----------------+ 
| f0_ |  time_zone  | hours_from_utc | 
+------+-------------------+----------------+ 
| 2014 | America/New_York |    -4 | 
| 2015 | America/New_York |    -4 | 
| 2016 | America/New_York |    -4 | 
| 2014 | Chile/Continental |    -4 | 
| 2015 | Chile/Continental |    -3 | 
| 2016 | Chile/Continental |    -4 | 
+------+-------------------+----------------+ 
+0

:o )試してみました。アメリカ/フェニックスとアメリカ/ロサンゼルスを試してみました。 - 1時間の差があると思っていましたが、両方とも-7を得ました。 –

+0

Googleも-7と言っています。)http://i.imgur.com/VH8hkyX .png(LAは-8を上回り、-7はどうやって得たのですか?) –

+0

しかし今はフェニックスでは7:04ですが、LAではちょうど6:04です。それは私が指摘したかったのです –

0

私の質問を投稿して以来、私は単純にオフセット付きのTIMESTAMP_SUB関数を使用して、デフォルトのUTCタイムスタンプを希望のタイムゾーンに変換しました。私はTableauのカスタムSQL機能では使用できない関数を作成する必要があったため、上のElliotの上品なソリューションは使用しませんでした。

興味のある方は、今のところ私は別の解決策を見つけましたが、それは醜いですが。 BigQueryでは、あるフォーマットから別のフォーマットに変換する際に、組み込みのタイムゾーンオフセット(たとえば、「America/Los_Angeles」)を許可します。例えば、日時にタイムスタンプから行く:

SELECT DATETIME(CURRENT_TIMESTAMP(),"America/Los_Angeles")

の例では、太平洋時間に現在のUTC時刻から行きます。しかし、それは現在、日時形式であり、Tableauは日付/時刻オブジェクトとして認識しません。

SELECT TIMESTAMP(DATETIME(CURRENT_TIMESTAMP(),"America/Los_Angeles"))

愚かな、洗練、そして約20%遅く、動作するようです:タイムスタンプ形式にそれを取り戻すために、私はTIMESTAMP関数に上記の機能を同封しました。

関連する問題