如何在BigQuery中将DATE和TIMESTAMP字符串类型转换为DATE类型

时间:2019-09-19 16:08:48

标签: google-bigquery

我有一个临时表,其中输入日期和输入时间戳始终为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。但是我希望能够处理两种类型-datetimestamp字符串。是否有1个单一函数会在输出中给我2017-08-01

重申一下,输入可以是"20170801""2017-08-01 15:30:00",并且我的函数应返回2017-08-01

2 个答案:

答案 0 :(得分:1)

您可以结合使用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 |
+----+------------+

答案 1 :(得分:0)

BigQuery标准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