从 BigQuery 中的日期减去 1 ISO 8601 年
Subtracting 1 ISO 8601 year from a date in BigQuery
我正在尝试操纵一个日期值,使时间正好回到 1 ISO-8601 年。
以下行不通,但最能说明我想要完成的工作:
date_add(date '2018-01-03', interval -1 isoyear)
我尝试将字符串转换作为中间步骤,但这也不起作用:
select parse_date('%G%V%u',safe_cast(safe_cast(format_date('%G%V%u',date '2018-01-03') as int64)-1000 as string))
为最后一个提供的错误是"Failed to parse input string "2017013""。我不明白为什么,这应该始终解析为唯一的日期值。
还有其他方法可以从日期中减去 ISO 年份吗?[=12=]
通过从日期中减去适当的周数,得出上一个 ISO 年份的相应日期。我的计算基于维基百科页面中 weeks per year 的描述:
CREATE TEMP FUNCTION IsLongYear(d DATE) AS (
-- Year starting on Thursday
EXTRACT(DAYOFWEEK FROM DATE_TRUNC(d, YEAR)) = 5 OR
-- Leap year starting on Wednesday
(EXTRACT(DAY FROM DATE_ADD(DATE(EXTRACT(YEAR FROM d), 2, 28), INTERVAL 1 DAY)) = 29
AND EXTRACT(DAYOFWEEK FROM DATE_TRUNC(d, YEAR)) = 4)
);
CREATE TEMP FUNCTION PreviousIsoYear(d DATE) AS (
DATE_SUB(d, INTERVAL IF(IsLongYear(d), 53, 52) WEEK)
);
SELECT PreviousIsoYear('2018-01-03');
这个returns2017-01-04
,也就是2017年ISO年的第三天。 2018-01-03
是 2018 ISO 年的第三天。
我正在尝试操纵一个日期值,使时间正好回到 1 ISO-8601 年。
以下行不通,但最能说明我想要完成的工作:
date_add(date '2018-01-03', interval -1 isoyear)
我尝试将字符串转换作为中间步骤,但这也不起作用:
select parse_date('%G%V%u',safe_cast(safe_cast(format_date('%G%V%u',date '2018-01-03') as int64)-1000 as string))
为最后一个提供的错误是"Failed to parse input string "2017013""。我不明白为什么,这应该始终解析为唯一的日期值。
还有其他方法可以从日期中减去 ISO 年份吗?[=12=]
通过从日期中减去适当的周数,得出上一个 ISO 年份的相应日期。我的计算基于维基百科页面中 weeks per year 的描述:
CREATE TEMP FUNCTION IsLongYear(d DATE) AS (
-- Year starting on Thursday
EXTRACT(DAYOFWEEK FROM DATE_TRUNC(d, YEAR)) = 5 OR
-- Leap year starting on Wednesday
(EXTRACT(DAY FROM DATE_ADD(DATE(EXTRACT(YEAR FROM d), 2, 28), INTERVAL 1 DAY)) = 29
AND EXTRACT(DAYOFWEEK FROM DATE_TRUNC(d, YEAR)) = 4)
);
CREATE TEMP FUNCTION PreviousIsoYear(d DATE) AS (
DATE_SUB(d, INTERVAL IF(IsLongYear(d), 53, 52) WEEK)
);
SELECT PreviousIsoYear('2018-01-03');
这个returns2017-01-04
,也就是2017年ISO年的第三天。 2018-01-03
是 2018 ISO 年的第三天。