从 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 年的第三天。