设置字符串日期格式,如下所示;2017年9月11日星期一00:00:00 GMT+;0200(CEST)“;使用sql

设置字符串日期格式,如下所示;2017年9月11日星期一00:00:00 GMT+;0200(CEST)“;使用sql,sql,google-bigquery,Sql,Google Bigquery,一切都在标题里。如何使用以下日期格式格式化字符串: 2017年9月11日星期一00:00:00 GMT+0200(CEST) 它位于标准SQL查询中的一个大查询表中 我从这个PARSE_DATE(“%a%b%j%Y”,DATE)开始,但我真的不知道如何处理剩下的内容 谢谢 我将从模拟这种类型的数据开始——所有数据都使用CEST,但日期不同: WITH `project.dataset.table` AS ( SELECT FORMAT_DATE('%a %b %d %Y GMT+02

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

2017年9月11日星期一00:00:00 GMT+0200(CEST)

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

我从这个
PARSE_DATE(“%a%b%j%Y”,DATE)
开始,但我真的不知道如何处理剩下的内容


谢谢

我将从模拟这种类型的数据开始——所有数据都使用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`;
对于
开始日期
2017年10月11日星期三00:00:00 GMT+0200
的输出看起来像
2017年10月6日星期五00:00:00 GMT+0200
。现在要解析日期字符串,我们可以将
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`;

这将返回
开始日期
结束日期
的实际
日期
值,例如
2017-10-06
2017-10-11
。要将其应用于您自己的表,请删除
WITH
子句,并根据需要更改表名。

我将首先模拟这种类型的数据——所有数据都使用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`;
对于
开始日期
2017年10月11日星期三00:00:00 GMT+0200
的输出看起来像
2017年10月6日星期五00:00:00 GMT+0200
。现在要解析日期字符串,我们可以将
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`;

这将返回
开始日期
结束日期
的实际
日期
值,例如
2017-10-06
2017-10-11
。若要将其应用于您自己的表,请删除
WITH
子句,并根据需要更改表名。

请澄清——目标是从字符串中解析该格式的日期,还是您正在尝试格式化字符串?@ElliottBrossard这一点的根本原因是我希望能够应用一个date_DIFF函数。我将开始日期和结束日期列作为字符串。我希望它们是一种日期格式。这更清楚吗?谢谢!我想我明白了,但还有一点需要澄清:每个
开始日期和
结束日期是否都在CEST中?或者还有其他时区吗?如果还有其他问题,请在您的问题中提供示例。所有内容都在CEST中。看看这个答案是否有帮助:)请澄清——目标是从字符串中解析该格式的日期,还是您正在尝试格式化字符串?@ElliottBrossard最根本的问题是,我希望能够应用date_DIFF函数。我将开始日期和结束日期列作为字符串。我希望它们是一种日期格式。这更清楚吗?谢谢!我想我明白了,但还有一点需要澄清:每个
开始日期和
结束日期是否都在CEST中?或者还有其他时区吗?如果还有其他问题,请在您的问题中提供示例。所有内容都在CEST中。看看这个答案是否有帮助:)