将字符串转换为时间戳

时间:2020-03-26 15:10:51

标签: sql google-bigquery

我有两栏。一个是UTC时间戳。第二列是格式为字符串的UTC偏移量。因此,加州为-08:00,巴黎为01:00。

如何合并两列以获得本地时间? 当我尝试将字符串转换为时间戳时,由于否定,我得到了无效的时间戳。

3 个答案:

答案 0 :(得分:1)

您可以使用timestamp()将时间戳的字符串表示形式转换为时间戳。

因此,这应该可行:

select timestamp('2020-01-01 00:00:00-08:00') as ca_time,
       timestamp('2020-01-01 00:00:00+01:00') as paris_time

如果您想在当地时间 ,则可以转换为datetime

select datetime(timestamp('2020-01-01 00:00:00-08:00'), 'America/New_York') as ca_time,
       datetime(timestamp('2020-01-01 00:00:00+01:00'), 'America/New_York') as paris_time

也就是说,我鼓励您将字符串转换为timestamp并将其保留在此处。只需将其转换为本地时间以用于输出目的并确定本地日期。学会与UTC一起工作有一定的学习曲线,但是可以避免很多问题。

答案 1 :(得分:0)

以下BigQuery示例

#standardSQL
WITH `project.dataset.yourtable` AS (
  SELECT '-08:00' timezone_offset, TIMESTAMP '2020-03-01 03:41:27 UTC' UTC_timestamp UNION ALL
  SELECT '01:00',  '2020-03-01 03:41:27 UTC'
)
SELECT * EXCEPT(hour, minute), 
  DATETIME(TIMESTAMP_ADD(TIMESTAMP_ADD(UTC_timestamp, INTERVAL CAST(hour AS INT64) HOUR), INTERVAL CAST(minute AS INT64) MINUTE)) AS local_time
FROM `project.dataset.yourtable`,
UNNEST([STRUCT(SPLIT(timezone_offset, ':')[OFFSET(0)] AS hour, SPLIT(timezone_offset, ':')[OFFSET(1)] AS minute)])

有输出

Row     timezone_offset     UTC_timestamp               local_time   
1       -08:00              2020-03-01 03:41:27 UTC     2020-02-29T19:41:27  
2       01:00               2020-03-01 03:41:27 UTC     2020-03-01T04:41:27  

答案 2 :(得分:0)

我经常做的事,我使用条件将时间戳UTC转换为本地日期时间。我在这里检查tz名称列表。 https://en.wikipedia.org/wiki/List_of_tz_database_time_zones。只要您拥有utc_offset或地区或国家/地区名称,就可以将UTC更改/转换为本地时间戳记/日期时间。

查询下方:

#standardSQL
WITH
  sample_data_utc AS (
  SELECT
    TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), SECOND) AS utc_timestamp,
    '01:00' AS utc_offset
  UNION ALL
  SELECT
    TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), SECOND) AS utc_timestamp,
    '-08:00' AS utc_offset)
SELECT
  STEP_ONE.utc_timestamp,
  CASE STEP_ONE.utc_offset
    WHEN '01:00'  THEN DATETIME(STEP_ONE.utc_timestamp, "Europe/Paris")
    WHEN '-08:00' THEN DATETIME(STEP_ONE.utc_timestamp, "America/Tijuana")
  --find out the TZ name in here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
  ELSE
  NULL
END
  AS local_timestamp
FROM
  sample_data_utc AS STEP_ONE

输出:

Row     utc_timestamp               local_timestamp  
1       2020-03-01 03:41:27 UTC     2020-02-29T19:41:27  
2       2020-03-01 03:41:27 UTC     2020-03-01T04:41:27