一切都在标题中。如何使用以下日期格式格式化字符串:
Mon Sep 11 2017 00:00:00 GMT+0200 (CEST)
它位于标准SQL查询中的大查询表中。
我已经开始使用PARSE_DATE("%a %b %j %Y", Date)
,但我真的不知道如何处理剩下的......
答案 0 :(得分:2)
我首先要模拟这种类型的数据 - 所有内容都使用CEST,但日期各不相同:
WITH `project.dataset.table` AS (
SELECT
FORMAT_DATE('%a %b %d %Y GMT+0200', date) AS start_date,
FORMAT_DATE('%a %b %d %Y GMT+0200',
DATE_ADD(date, INTERVAL MOD(off, 7) DAY)) AS end_date
FROM UNNEST(GENERATE_DATE_ARRAY('2017-09-01', '2018-04-11', INTERVAL 7 DAY)) AS date WITH OFFSET off
)
SELECT
start_date,
end_date
FROM `project.dataset.table`;
这为Fri Oct 06 2017 00:00:00 GMT+0200
提供了start_date
的输出,为Wed Oct 11 2017 00:00:00 GMT+0200
提供了end_date
的输出。现在要解析日期字符串,我们可以将PARSE_DATE
与REGEXP_EXTRACT
结合使用;最简单的方法是将逻辑打包到UDF中以便在查询中重用:
CREATE TEMP FUNCTION ConvertToDate(date_string STRING) AS (
PARSE_DATE('%b %d %Y', REGEXP_EXTRACT(date_string, r'[^ ]+ (.*)00:00:00'))
);
将它与样本输入相结合,我们现在有以下查询:
CREATE TEMP FUNCTION ConvertToDate(date_string STRING) AS (
PARSE_DATE('%b %d %Y', REGEXP_EXTRACT(date_string, r'[^ ]+ (.*)00:00:00'))
);
WITH `project.dataset.table` AS (
SELECT
FORMAT_DATE('%a %b %d %Y 00:00:00 GMT+0200', date) AS start_date,
FORMAT_DATE('%a %b %d %Y 00:00:00 GMT+0200',
DATE_ADD(date, INTERVAL MOD(off, 7) DAY)) AS end_date
FROM UNNEST(GENERATE_DATE_ARRAY('2017-09-01', '2018-04-11', INTERVAL 7 DAY)) AS date WITH OFFSET off
)
SELECT
ConvertToDate(start_date) AS start_date,
ConvertToDate(end_date) AS end_date
FROM `project.dataset.table`;
这会返回DATE
和start_date
的真实end_date
值,例如2017-10-06
和2017-10-11
。要将其应用于您自己的表,请删除WITH
子句并根据需要更改表名。