BigQuery конвертирует unix метку времени в структуру даты и времени - PullRequest
0 голосов
/ 08 января 2020

У меня есть таблица BigQuery, которая содержит столбец структуры с именем daySliderTimes в следующей форме:

daySliderTimes STRUCT<_field_1 STRUCT<_seconds INT, _nanoseconds INT>, _field_1 STRUCT<_seconds INT, _nanoseconds INT>.

_field_1 и _field_2 представляют две разные временные метки. _seconds и _nanoseconds представляют время с unix эпохи.

Я хочу преобразовать данные в новый STRUCT со следующей формой:

daySlidertimes STRUCT<startTime DATETIME, endTime DATETIME>

Это таблица в пользовательском интерфейсе BigQuery:

enter image description here

Ответы [ 2 ]

0 голосов
/ 09 января 2020

Вы можете использовать функцию TIMESTAMP_SECONDS () . Эта функция преобразует секунды в формат DATETIME .

Таким образом, вы можете преобразовать daySliderTimes._field_1.seconds в дату, используя TIMESTAMP_SECONDS () . Кроме того, для _field_2 , затем агрегируйте их в новом формате структуры.

Во время создания представления или таблицы вы можете сделать следующее:

WITH table_newStruct as(
  SELECT 
#Select all the desired fields
         searchDocId,
         STRUCT(TIMESTAMP_SECONDS(daySliderTimes._field_1.seconds) as startTime, 
         TIMESTAMP_SECONDS(daySliderTimes._field_.seconds) as endTime) as new_daySlidertimes

FROM 'table_source')

SELECT searchDocId, new_daySlidertimes 
FROM 'table_newStruct'

Кроме того, возвращаемое TIMESTAMP должно быть в следующем формат 1970-01-01 00:00:00 UT C. Вы можете отформатировать его с помощью функции FORMAT_DATE () .

0 голосов
/ 08 января 2020

Если вы хотите создать новую таблицу из старой таблицы в формате daySlidertimes STRUCT<startTime DATETIME, endTime DATETIME>, вы можете привести данные в миллисекунды и затем преобразовать их в TIMESTAMP с помощью функции «TIMESTAMP_MICROS», проверьте эту ссылку, чтобы увидеть сумму функций для разбора метки времени [1].

Пример запроса должен выглядеть примерно так:

CREATE TABLE `project.dataset.new_table` AS 
   SELECT searchDocId, 
   STRUCT(TIMESTAMP_MICROS(CAST( 
   ((daySliderTimes.field1.seconds * 1e+6)  + 
   ROUND(daySliderTimes.field1.nanoseconds * 0.001)) AS INT64)) as 
   startTime, 
   TIMESTAMP_MICROS(CAST( ((daySliderTimes.field2.seconds * 1e+6)  + 
   ROUND(daySliderTimes.field2.nanoseconds * 0.001)) AS INT64)) as endTime) 
   as daySliderTimes, 
   enabledDaySliders
FROM `project.dataset.old_table`

[1] https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#parse_timestamp

...