ISO周(201905)BigQuery的Extraxt日期

时间:2019-05-18 05:34:24

标签: sql google-bigquery

我需要从ISO周编号中提取星期日的日期:即201905 它必须在#standardSQL中,因为它将使用不支持旧版脚本的脚本进行调度。

我尝试调整Google表格中的工作公式,但无法弄清楚。 Google表格中的原始公式:

TO_TEXT (
(DATE(LEFT(Week_ISO,4),1,1)
- (WEEKDAY(DATE(LEFT(Week_ISO,4),1,1))-2)
+ (RIGHT(Week_ISO,2)-1)*7) 
+6)

3 个答案:

答案 0 :(得分:1)

根据我对文档的阅读,这应该有效:

PARSE_DATE('%G%V', isoyyyymm)

但事实并非如此。

所以,这是一个替代方案:

SELECT DATE_ADD(DATE_TRUNC(PARSE_DATE('%Y%m%d', CONCAT(substr(isoyyyyww, 1, 4), '0601')),
                           isoyear
                          ),
                INTERVAL CAST(substr(isoyyyyww, -2) as int64) WEEK
               )
FROM (SELECT '200506' as isoyyyyww);

这里的想法如下:

  • 将yyyyww格式转换为年中的日期。
  • 将日期截断为ISO年份的开始。
  • 重新添加适当的星期数。

如果您的值是数字而不是字符串,则可以对此进行调整。

答案 1 :(得分:0)

看来您的主张并不完全正确。例如,它在200101周不起作用。根据您的公式,答案是2001-01-08。

这是我的建议:

SELECT  DATE_ADD(DATE_TRUNC(PARSE_DATE('%Y%m%d', CONCAT(substr(isoyyyyww, 1, 4), '0104')),isoyear), INTERVAL CAST(substr(isoyyyyww, -2) as int64)-1 WEEK)
FROM (SELECT '200506' as isoyyyyww);

答案 2 :(得分:0)

对我来说,另一个选择是不更改为ISOWEEK。 iso周仍然会丢失年份信息。相反,我只是将所有日期都推迟到ISOWEEK的第一天。

DATE_ADD(
  LAST_DAY(DATETIME(date), ISOWEEK), 
  INTERVAL 
  -6 
  DAY) as login_week