Presto如何找到给定一周的开始日期

Presto how to find start date given week

我想从给定的 ISO 周 开始日期(范围可以从 1-53星期一 作为开始日期)和使用 Presto SQL 查询的年份。

即年 - 2020 和周 - 2 应该 return 06/01/2020

有内置函数吗?

Table结构:

select year, week from table1; // returns year and week from table table 1

使用DATE_ADDMAKEDATE你可以得到结果...

select DATE_ADD(MAKEDATE(year, 1), INTERVAL (week-1) WEEK) as start_date from <table_name>;

没有直接的方法从年 + 周构造日期(这有一个问题:https://github.com/trinodb/trino/issues/2287), but you can achieve what you want with the date_parse 函数。

例如:

WITH data (year, week) AS (VALUES (2020, 2))
SELECT CAST(date_parse(CAST(year AS varchar) || ':' || CAST(week AS varchar), '%x:%v') AS date)
FROM data

产生:

   _col0
------------
 2020-01-06
(1 row)

Martin 的答案就快有了。您应该使用 year_of_week 而不是 year。尽管进行了此更改,但您必须确保不会出现流血到下一年或上一年的几周的错误,即上一年的最后几天或下一年的第一天。

year_of_week returns ISO 周的年份。

这是一个例子:

WITH data (year, week) AS (VALUES (2020, 2))
SELECT CAST(date_parse(CAST(year_of_week AS varchar) || ':' || CAST(week AS varchar), '%x:%v') AS date)
FROM data

参考文献:

我认为对于部分周(当新年的第一天仍算作第 53 周时)这不起作用:

Query failed (#20210624_142222_02859_zf75v): Cannot parse "2021:53": Value 53 for weekOfWeekyear must be in the range [1,52]

通过这个公式测试:

日期是 2021 年 1 月 2 日,仍被视为第 53 周,但在 2021 年...

CAST(date_parse(CAST(year(date(service_order_creation_date)) AS varchar) || ':' || CAST(week(date(service_order_creation_date)) AS varchar), '%x:%v') AS date)