我有一个包含字符串类型列'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函数的问题,还是我遗漏了什么?
答案 0 :(得分:4)
尝试做类似
的事情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)