PostgreSQL -获得一致的年周对跨年



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

看了这里的问题,特别是这个注释之后:

按date_part('year', x), date_part('week', x)分组是最有可能的不是用户想要的,应该被认为是不正确的。为例如,2017年的第一天仍然是第52周的一部分因此(2017,52)对可能根本不适合你直到2017年底。使用' date_trunc('week', x) ' on另一方面则如人们所期望的那样。

我尝试了date_truncdate_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
    

    相关内容

    • 没有找到相关文章

    最新更新