我有一个临时表,其中输入日期和输入时间戳始终为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
字符串。是否有1个单一函数会在输出中给我2017-08-01
?
重申一下,输入可以是"20170801"
或"2017-08-01 15:30:00"
,并且我的函数应返回2017-08-01
。
答案 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