Преобразовать строку в формате ЧЧ: ММ: СС в секунды в Google BigQuery (стандартный SQL) - PullRequest
2 голосов
/ 27 марта 2019

В моих таблицах из Google Analytics есть собственное измерение, которое называется "длина видео".Данные являются строковыми значениями, но некоторые принимают 3 из следующих форматов:

1) ЧЧ: ММ: СС (например, 1:54:55)

2) ММ: СС(например, 2:26)

3) # секунд (например, для видео длиной 2:26 длина будет 146 )

  • Я попытался указать регистр в случаях, когда значение имело формат ЧЧ: ММ: СС или ММ: СС, а также длину символа.
  • Я также добавил дополнительные нули к значениям, следующим за форматом MM: SS.
  • Мне пришлось CAST, чтобы INT64, чтобы я мог сложить значения, чтобы получить строку.

Запрос действителен, однако, когда я запускаю запрос, я получаю сообщение об ошибке «Не удалось разобрать входную строку»

select old_video_length,
 case 
  when videoLength like "%:%" and length(videoLength) > 7 then cast(cast(parse_time("%E*S",videoLength) as string) as int64)+cast(cast(parse_time("%M",videoLength) as string) as int64)*60+cast(cast(parse_time("%H",videoLength) as string) as int64)*3600
  when videoLength like "%:%" and length(videoLength) between 6 and 7 then cast(cast(parse_time("%E*S",concat("0",videoLength)) as string) as int64)+cast(cast(parse_time("%M",concat("0",videoLength)) as string) as int64)*60+cast(cast(parse_time("%H",concat("0",videoLength)) as string) as int64)*3600
  when videoLength like "%:%" and length(videoLength) <= 5 then cast(cast(parse_time("%E*S",concat("00:",videoLength)) as string) as int64)+cast(cast(parse_time("%M",concat("00:",videoLength)) as string) as int64)*60+cast(cast(parse_time("%H",concat("00:",videoLength)) as string) as int64)*3600
  else cast(videoLength as int64) end as video_length_converted
  from vid_length_table


Ideally, I'd like the table to look like this: 

old_video_length | video_length_converted
1:54:55            6895
2:26               146
146                146

Ответы [ 2 ]

2 голосов
/ 27 марта 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT videoLength AS old_video_length,
  CASE
    WHEN REGEXP_CONTAINS(videoLength, r':\d\d:\d\d$') THEN TIME_DIFF(SAFE.PARSE_TIME('%T', videoLength), TIME '00:00:00', SECOND)
    WHEN REGEXP_CONTAINS(videoLength, r':\d\d$') THEN TIME_DIFF(SAFE.PARSE_TIME('%M:%S', videoLength), TIME '00:00:00', SECOND)
    ELSE SAFE_CAST(videoLength AS INT64)
  END AS video_length_converted
FROM `project.dataset.vid_length_table`  

Вы можете проверить, поиграть с выше, используя пример данных из вашего вопроса, как в примере ниже

#standardSQL
WITH `project.dataset.vid_length_table` AS (
  SELECT '1:54:55' videoLength UNION ALL
  SELECT '2:26' UNION ALL
  SELECT '146'
)
SELECT videoLength AS old_video_length,
  CASE
    WHEN REGEXP_CONTAINS(videoLength, r':\d\d:\d\d$') THEN TIME_DIFF(SAFE.PARSE_TIME('%T', videoLength), TIME '00:00:00', SECOND)
    WHEN REGEXP_CONTAINS(videoLength, r':\d\d$') THEN TIME_DIFF(SAFE.PARSE_TIME('%M:%S', videoLength), TIME '00:00:00', SECOND)
    ELSE SAFE_CAST(videoLength AS INT64)
  END AS video_length_converted
FROM `project.dataset.vid_length_table`   

с результатом

Row old_video_length    video_length_converted   
1   1:54:55             6895     
2   2:26                146  
3   146                 146  
1 голос
/ 29 марта 2019

Сначала преобразуйте строку в отметку времени , используя тот же формат, что и в столбце, и мы можем преобразовать отметку времени в секунды, используя UNIX_SECONDS function

Решение:

#standardSQL
SELECT
case 
  when videoLength like "%:%:%" then UNIX_SECONDS(PARSE_TIMESTAMP("%H:%M:%S",videoLength))
  when videoLength like "%:%" then UNIX_SECONDS(PARSE_TIMESTAMP("%M:%S",videoLength))
  else cast(videoLength as int64) end as video_length_converted
from vid_length_table

Пример:

#standardSQL
WITH vid_length_table as (
  SELECT '1:54:55' videoLength UNION ALL
  SELECT '2:26' UNION ALL
  SELECT '146'
) 
SELECT videoLength AS old_video_length,
case 
  when videoLength like "%:%:%" then UNIX_SECONDS(PARSE_TIMESTAMP("%H:%M:%S",videoLength))
  when videoLength like "%:%" then UNIX_SECONDS(PARSE_TIMESTAMP("%M:%S",videoLength))
  else cast(videoLength as int64) end as video_length_converted
from vid_length_table

Результат:

Row old_video_length    video_length_converted   
1   1:54:55             6895     
2   2:26                146  
3   146                 146  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...