我一直在努力寻找在postgesql中检索一致(年,周)对的解决方案。
看了这里的问题,特别是这个注释之后:
按date_part('year', x), date_part('week', x)分组是最有可能的不是用户想要的,应该被认为是不正确的。为例如,2017年的第一天仍然是第52周的一部分因此(2017,52)对可能根本不适合你直到2017年底。使用' date_trunc('week', x) ' on另一方面则如人们所期望的那样。
我尝试了date_trunc
和date_part
的组合。然而,似乎没有一个能给出一致的结果。
例如:考虑不同年份之间的两个日期:'2017-01-01'
和'2020-01-01'
。
我认为正确的(年,周)对应该是(2016, 52)
和(2020, 1)
。
我不知道如何写一个SQL语句来给出这两个结果。
我试着:
1。
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天,我需要避免这种情况。
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