PostgreSQL - 跨年份获取一致的年周对

3
我一直在思考如何在PostgreSQL中检索一致的(年,周)对解决方案。
在查看这里的问题(https://dev59.com/4loV5IYBdhLWcg3wnf3r)以及特别是这条评论(https://dev59.com/4loV5IYBdhLWcg3wnf3r#RrKiEYcBWogLw_1bJzmd)后:
按date_part('year', x), date_part('week', x)分组很可能不是用户想要的,应该被认为是不正确的。例如,2017年的第一天仍然属于2016年的第52周,因此(2017, 52)对可能根本不是您想要的结果,因为它会排序到2017年的末尾。另一方面,使用'date_trunc('week', x)`可以像预期的那样工作。
我尝试了一些date_trunc和date_part的组合。然而,都没有给出一致的结果。
例如:考虑这两个不同年份之间的日期:“2017-01-01”和“2020-01-01”。
我认为它们的正确(年,周)对应该是(2016, 52)和(2020, 1)。
我不知道如何编写一个SQL语句来给出这两个结果。
我尝试了:
SELECT date_part('year', date_trunc('week', TIMESTAMP '2017-01-01 00:00:00')); --2016 OK
SELECT date_part('week', date_trunc('week', TIMESTAMP '2017-01-01 00:00:00')); --52 OK
SELECT date_part('year', date_trunc('week', TIMESTAMP '2020-01-01 00:00:00')); --2019 BUT I NEED 2020
SELECT date_part('week', date_trunc('week', TIMESTAMP '2020-01-01 00:00:00')); --1 OK
SELECT date_part('year', TIMESTAMP '2017-01-01 00:00:00'); --2017 BUT I NEED 2016
SELECT date_part('week', TIMESTAMP '2017-01-01 00:00:00'); --52 OK
SELECT date_part('year', TIMESTAMP '2020-01-01 00:00:00'); --2020 OK
SELECT date_part('week', TIMESTAMP '2020-01-01 00:00:00'); --1 OK

无论如何,总是有些问题存在,我可能需要一些能够给出正确结果的东西。我的问题是,在按年份和周分组时,有时会考虑到超过7天的情况,我需要避免这种情况。
1个回答

4

week 单位返回基于 ISO 标准的周数。若要获得相应的年份,请使用 isoyear

SELECT date_part('isoyear', TIMESTAMP '2017-01-01 00:00:00'), 
       date_part('week', TIMESTAMP '2017-01-01 00:00:00'),
       date_part('isoyear', TIMESTAMP '2020-01-01 00:00:00'), 
       date_part('week', TIMESTAMP '2020-01-01 00:00:00'); 

返回:

date_part | date_part | date_part | date_part
----------+-----------+-----------+----------
     2016 |        52 |      2020 |         1

太好了,6分钟后我就可以接受你的答案。非常感谢;) - umbe1987

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接