使用sql格式化字符串日期,如“Mon Sep 11 2017 00:00:00 GMT + 0200(CEST)”

时间:2018-04-11 15:37:17

标签: sql google-bigquery

一切都在标题中。如何使用以下日期格式格式化字符串:

Mon Sep 11 2017 00:00:00 GMT+0200 (CEST)

它位于标准SQL查询中的大查询表中。

我已经开始使用PARSE_DATE("%a %b %j %Y", Date),但我真的不知道如何处理剩下的......

谢谢!

1 个答案:

答案 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_DATEREGEXP_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`;

这会返回DATEstart_date的真实end_date值,例如2017-10-062017-10-11。要将其应用于您自己的表,请删除WITH子句并根据需要更改表名。