我目前正在开发一个应用程序,我需要对传入数据进行排序,根据传入记录的年份和星期将其放入表格中。
是我用来date_part('week', created_date)::text获取星期几,它在 99% 的时间里工作得很好,但是当created_date在一月初时,例如 02.01.2021,date_part('week', created_date)::text返回数字 53,从逻辑上讲它显然是第一个一年中的第几周,也许你可以建议我如何获得一年中 100% 的正确周数?
来自文档:
该日所在的年份中的第几周。根据定义 (ISO 8601),一年中的第一周包含该年的 1 月 4 日。(ISO-8601 周从星期一开始。)换句话说,一年的第一个星期四位于该年的第一周。
因此,一月初的日期可能是上一年的第 52 或 53 周的一部分。例如,2005-01-01 是 2004 年第 53 周的一部分,2006-01-01 是 2005 年第 52 周的一部分。
所以,1 月 1 日并不总是在第一周,这是很正常的。所以,53 在这里是正确的,因为它表示上一年的第 53 周。
不幸的是,没有什么isoweek比一年date_part()更好的了isoyear。week始终是 ISO 周。但您可以使用此解决方法:
要使用特定模式将日期转换为字符串,可以使用wwand iw- week 和 ISO week:
SELECT to_char('2021-01-02'::date, 'iyyy-iw');
Run Code Online (Sandbox Code Playgroud)
返回2020-53,ISO 值。然而
SELECT to_char('2021-01-02'::date, 'yyyy-ww');
Run Code Online (Sandbox Code Playgroud)
返回2021-01,这正是您所期望的。
因此,您可以使用 to_char 来获取周数,然后将其转换为int:
SELECT to_char('2021-01-02'::date, 'ww')::int;
Run Code Online (Sandbox Code Playgroud)