Преобразование строки в метку времени - PullRequest
0 голосов
/ 26 марта 2020

У меня есть две колонки. Тот, который является отметкой времени UT C. Второй столбец - это смещение UT C, отформатированное в виде строки. Таким образом, в Калифорнии будет -08: 00, а в Париже будет 01: 00.

Как объединить два столбца, чтобы получить местное время? Когда я пытаюсь привести строку к метке времени, я получаю неверную метку времени из-за негативов.

Ответы [ 3 ]

1 голос
/ 26 марта 2020

Вы можете преобразовать строковое представление метки времени в метку времени, используя 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

Если вы хотите local время, вы можете преобразовать в 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 s и оставить их там . Просто конвертируйте в местное время для целей вывода и определения локальной даты. Обучение работе с UT C имеет некоторую кривую обучения, но предотвращает множество проблем в будущем.

0 голосов
/ 05 апреля 2020

Что я всегда делаю, я использую условие для преобразования метки времени UT C в локальную дату и время. Я проверяю список имен tz здесь. https://en.wikipedia.org/wiki/List_of_tz_database_time_zones. Если у вас есть utc_offset или название региона или страны, вы можете изменить / преобразовать UT C в местную метку времени / дату / время.

Ниже запроса:

#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  
0 голосов
/ 26 марта 2020

Ниже приведен пример для 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  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...