3

我一直在努力寻找在 PostrgeSQL 中检索一致(年、周)对的解决方案。

在这里查看问题后,特别是在此评论中:

按 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)and (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 天,我需要避免这种情况。

4

1 回答 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
于 2021-02-12T11:41:47.483 回答