Как преобразовать строковые типы DATE и TIMESTAMP в типы DATE в BigQuery - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть временная таблица, в которой дата и время ввода всегда имеют тип string.Я хочу посмотреть, есть ли одна отдельная функция, которая обрабатывает эти оба типа и дает мне DATE в выводе в формате yyyy-MM-dd.

Вот мой код -

with temp as 
(
select "1" as id
,  "20170801" as input_date_string -- this is of string type
,  "2017-08-01 15:30:00" as input_timestamp_string -- this is also of string type
)

select id
, input_date_string
, input_timestamp_string
, FORMAT_DATE( '%Y-%m-%d' ,  PARSE_DATE('%Y%m%d', input_date_string) ) AS output_format_date
from temp

Я могу отформатировать input_date_string.Но я хочу иметь возможность обрабатывать оба типа - date и timestamp string.Есть ли одна единственная функция, которая выдаст мне 2017-08-01 на выходе?

Повторюсь, вход может быть либо "20170801", либо "2017-08-01 15:30:00", и моя функция должна вернуть мне 2017-08-01.

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Вы можете объединить SAFE. префикс и COALESCE(), чтобы сделать это:

with temp as 
(
select "1" as id, "20170801" as input_date_string 
union all
select "2", "2017-08-01 15:30:00"
)

select id
, COALESCE(
  FORMAT_DATE( '%Y-%m-%d' ,  SAFE.PARSE_DATE('%Y%m%d', input_date_string) ),
  FORMAT_DATETIME( '%Y-%m-%d' ,  SAFE.PARSE_DATETIME('%Y-%m-%d %H:%M:%S', input_date_string) )
  ) result_date
from temp

Выход:

+----+------------+
| id |result_date |
+----+------------+
| 1  | 2017-08-01 |
| 2  | 2017-08-01 |
+----+------------+
0 голосов
/ 19 сентября 2019

Ниже опция для BigQuery Standard SQL

#standardSQL
CREATE TEMP FUNCTION CUSTOM_FORMAT_DATE(str STRING) AS (
  CASE 
    WHEN LENGTH(str) = 8 THEN FORMAT_DATE('%Y-%m-%d', PARSE_DATE('%Y%m%d', str))
    ELSE FORMAT_DATE('%Y-%m-%d', DATE(TIMESTAMP(str)))
  END
);
WITH temp AS 
(
SELECT "1" AS id
,  "20170801" AS input_date_string -- this is of string type
,  "2017-08-01 15:30:00" AS input_timestamp_string -- this is also of string type
)

SELECT id
, input_date_string
, input_timestamp_string
, CUSTOM_FORMAT_DATE(input_date_string)
, CUSTOM_FORMAT_DATE(input_timestamp_string)
FROM temp  

с выводом

Row id  input_date_string   input_timestamp_string  f0_         f1_  
1   1   20170801            2017-08-01 15:30:00     2017-08-01  2017-08-01   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...