【问题标题】:PostgreSQL - Getting consistent year week pairs across yearsPostgreSQL - 跨年获得一致的年周对
【发布时间】:2021-02-12 11:34:20
【问题描述】:

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

看了here的问题,特别是this comment

按 date_part('year', x) 分组,date_part('week', x) 最有可能 不是用户想要的,应该被认为是不正确的。为了 例如,2017 年的第一天仍然是第 52 周的一部分,从 2016 年,因此 (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 天,我需要避免这种情况。

【问题讨论】:

    标签: postgresql date datetime postgresql-10


    【解决方案1】:

    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 分钟,我可以接受你的回答。非常感谢;)
    猜你喜欢
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 2015-11-14
    • 2021-12-23
    • 2017-09-19
    相关资源
    最近更新 更多