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

问题描述

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

在查看问题 here 之后,特别是在 this comment

按 date_part('year',x),date_part('week',x) 分组最有可能 不是用户想要的,应该被认为是不正确的。为了 例如,2017 年的第一天仍然是第 52 周的一部分 2016 年,因此 (2017,52) 对可能根本不是你想要的 想要,因为它排序到 2017 年底。使用 'date_trunc('week',x)` 另一只手按预期工作。

我尝试了 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',TIMESTAMP '2017-01-01 00:00:00')); --52 OK
SELECT date_part('year',TIMESTAMP '2020-01-01 00:00:00')); --2019 BUT I NEED 2020
SELECT date_part('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',date_part('isoyear',TIMESTAMP '2020-01-01 00:00:00'),TIMESTAMP '2020-01-01 00:00:00'); 

返回:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...