2017-06-17 56 views
0

我看了其他類似的帖子,並不確定他們是否懷疑地回答了這個問題 - 也許他們會這樣做,對不起,如果我錯過了可以回答這個問題的任何問題。BigQuery字符串時間戳在源中保留時區

我有一個字符串

"2017-06-16T10:34:57.705+01:00" 

如何將它轉換爲一個「時間戳」類型從字符串,但保留精度(毫秒)和時區偏移?

TIMESTAMP("2017-06-16T10:34:57.705+01:00") 

轉換爲時間戳UTC和失去毫秒精度,我希望有一個時間戳類型,但保留了當地的日期與時區的所有的精密度?

FORMAT_TIMESTAMP("%Y-%m-%dT%H:%M:%E*S%Ez",PARSE_TIMESTAMP("%Y-%m-%dT%H:%M:%E*S%Ez", "2017-06-16T10:34:57.705+01:00"),"Europe/London") 

這保留了精密度,並偏移,但是是一個字符串 - 然後我失去了這個試圖轉換爲時間戳再次TIMESTAMP(X)!

我覺得我在周圍繞着任何幫助讚賞謝謝!

乾杯

回答

1

TIMESTAMP類型是在相對於UNIX紀元某個時間點。儘管TIMESTAMP相關函數默認使用UTC,但其具有微秒精度並且不編碼時區。用於提取DATE

目前尚不清楚爲什麼要保留時間戳的原始時區,但您可以做的一件事就是保留一個整數列與UTC的偏移量,您可以使用TIMESTAMP_DIFF之間的輸入時間戳忽略它時區在字符串和輸入時間戳在字符串中使用它的時區。

爲了提高精確度,您可以檢查提供的時間戳與TIMESTAMP_TRUNC的結果之間的相等性,例如, MILLISECOND看看精度是多少。我不知道你想要怎麼處理這些信息,但是你也可以使用一個字符串或整數來表示精度。

+0

由於埃利奧特 - 中保持時區的原因是基於時間的隊列(例如翻滾窗口)正在使用(至少向該區域中的用戶顯示)圖上的時間,而不是UTC。我們在世界各地設有辦事處,並希望展示相關時間(例如所下訂單),包括保留夏令時/夏令時等。無論如何,我將原始文件存儲爲JSON。非常感謝評論 –

1

只是作爲一種補充,你實際上並沒有失去精度,當你申請的PARSE_TIMESTAMP,你可以通過使用UNIX_MILLIS功能檢查:

WITH data AS(
    SELECT "2017-06-16T10:34:57.705+01:00" as date union all 
    SELECT "2017-06-16T10:34:57.999+01:00" as date 
) 

SELECT 
    date, 
    UNIX_MILLIS(PARSE_TIMESTAMP("%Y-%m-%dT%H:%M:%E*S%Ez", date, "Europe/London")) millis_date 
FROM data 

結果:

Row date       millis_date 
1 2017-06-16T10:34:57.999+01:00 1497605697999  
2 2017-06-16T10:34:57.705+01:00 1497605697705