【问题标题】:Extract dates from week numbers on BigQuery从 BigQuery 上的周数中提取日期
【发布时间】:2017-06-20 13:42:20
【问题描述】:

我有一个包含字符串类型列“YearMonthWeek”的大型数据文件 它包含诸如 2016 年 1 月第一周的“20160101”或 2016 年第 40 周的“20161040”等值,显然是在 10 月。

现在,我想将这些字符串转换为实际日期,以便将每个 YearMonthWeek 值转换为,例如该周的第一天。 (不管是周一还是周日,我都不在乎)。

我尝试了以下查询:

PARSE_TIMESTAMP('%Y%m%W', CAST(YearMonthWeek AS STRING)) AS datefield

(详见this文档) 这运行没有错误,但每个条目都会在每月的第一天返回我......

例如,“20160101”和“20160102”都被解析为 2016-01-01 00:00:00 UTC。

这是 PARSE_TIMESTAMP 函数的问题,还是我遗漏了什么?

【问题讨论】:

  • 可能是重复的,或者可能只是帮助你stackoverflow.com/questions/30364141/…
  • 这很奇怪。我刚刚尝试了select PARSE_TIMESTAMP('%Y%W', '201640') ,这将返回 2016-01-01。 %W 解析可能有问题。
  • 是的,你需要去掉不必要的月份或日期
  • @RiggsFolly 不起作用。
  • 有一个相关的feature request to support %W。但是,它很可能只会启用年和周,但不会启用年、月和周。

标签: google-bigquery google-cloud-platform date-parsing


【解决方案1】:

尝试做类似的事情

DATE_ADD(date_expression, INTERVAL %W WEEK)

静态示例:

SELECT
  DATE_ADD(
          DATE(PARSE_TIMESTAMP('%Y', SUBSTR(CAST('20161252' AS STRING),0,4))),
          INTERVAL (CAST(SUBSTR(CAST('20160102' AS STRING),7) AS INT64)) week) 
        AS datefield

-

Row datefield    
1   2016-01-15  

您可以在其中添加一些内容作为边距,根据ISO 8601,一年的第一周是包含 1 月 4 日的那一周。所以你可以有这样的东西: 4 + 7*($week - 1)

【讨论】:

  • 这个问题是针对 Google BigQuery 的。它在那里工作。 MySQL 不同,它不是基于 SQL2011 标准的。
  • 我向乡绅道歉
  • 这将适用于 1 月的日期,但您将在其他月份失败。第一部分应该只保留年份,以便间隔添加从 1 月 1 日开始。
  • 最终使用了这个:SELECT DATE_ADD( DATE(PARSE_TIMESTAMP('%Y', SUBSTR(CAST('20161252' AS STRING),0,4))), INTERVAL(CAST(SUBSTR(CAST('20161252' AS STRING),7) AS INT64)) week) AS datefield 非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多