Google bigquery 从BigQuery上的周数中提取日期
我有一个包含字符串类型列“YearMonthWeek”的大型数据文件 它包含2016年1月第一周的“20160101”或2016年第40周的“20161040”等值,这些值显然在10月份 现在,我想将这些字符串转换为实际日期,以便将每个YearMonthWeek值转换为,例如,该周的第一天。(不管结果是星期一还是星期天,我都不在乎) 我尝试了以下查询:Google bigquery 从BigQuery上的周数中提取日期,google-bigquery,google-cloud-platform,date-parsing,Google Bigquery,Google Cloud Platform,Date Parsing,我有一个包含字符串类型列“YearMonthWeek”的大型数据文件 它包含2016年1月第一周的“20160101”或2016年第40周的“20161040”等值,这些值显然在10月份 现在,我想将这些字符串转换为实际日期,以便将每个YearMonthWeek值转换为,例如,该周的第一天。(不管结果是星期一还是星期天,我都不在乎) 我尝试了以下查询: PARSE_TIMESTAMP('%Y%m%W', CAST(YearMonthWeek AS STRING)) AS datefield (
PARSE_TIMESTAMP('%Y%m%W', CAST(YearMonthWeek AS STRING)) AS datefield
(有关详细信息,请参阅文档)
它运行时没有错误,但会为每个条目返回一个月的第一天
因此,例如“20160101”和“20160102”都被解析为2016-01-01 00:00:00 UTC
这是PARSE_TIMESTAMP函数的问题,还是我遗漏了什么
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
-
你可以加一些东西作为空白,根据,一年的第一周是包含1月4日的那一周。所以你可以做这样的事情:4+7*($week-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
-
你可以加一些东西作为空白,根据,一年的第一周是包含1月4日的那一周。所以你可以有这样的东西:4+7*($week-1)可能是重复的,或者可能只是帮你解决这个问题,这很奇怪。我刚刚尝试了
选择PARSE_TIMESTAMP(“%Y%W”,“201640”)
并返回2016-01-01。可能是%W
解析有问题。是的,您需要释放不必要的月份部分或date@RiggsFolly不起作用,有一个相关的问题。它很可能只启用年和周,但不启用年、月和周。可能是重复的,或者可能只是帮助您解决这一问题。我刚刚尝试了选择PARSE_TIMESTAMP(“%Y%W”,“201640”)
并返回2016-01-01。可能是%W
解析有问题。是的,您需要释放不必要的月份部分或date@RiggsFolly不起作用,有一个相关的问题。不过,它很可能只启用年和周,而不启用年、月和周。它在那里工作。MySQL是不同的,它不是基于SQL2011标准的。我很抱歉,squireThis将在1月份有效,但在其他月份会失败。第一部分应仅保留年份,以便间隔添加从1月1日开始。最后使用此部分:选择日期添加(日期(解析时间戳('%Y',SUBSTR(CAST('20161252'作为字符串),0,4))、间隔(CAST(SUBSTR(CAST('20161252'作为字符串),7)作为INT64))作为日期字段
Thx很多!这个问题是针对Google BigQuery的。它在那里工作。MySQL是不同的,它不是基于SQL2011标准的。我很抱歉,squireThis将在1月份有效,但在其他月份会失败。第一部分应仅保留年份,以便间隔添加从1月1日开始。最后使用此部分:选择日期添加(日期(解析时间戳('%Y',SUBSTR(CAST('20161252'作为字符串),0,4))、间隔(CAST(SUBSTR(CAST('20161252'作为字符串),7)作为INT64))作为日期字段
Thx很多!