【问题标题】:Inconsistent week of year number for December 31 in Postgres... 1, 52, or 53Postgres 中 12 月 31 日的年份数不一致... 1、52 ​​或 53
【发布时间】:2015-12-16 19:35:14
【问题描述】:

在尝试按一年中的星期分组时,我发现 12 月 31 日在 Postgres 中返回的一年中的一周因年份而异,结果出乎意料(至少对我而言)。结果通常是 52(好),有时是 53,通常是 1。

53 我可以理解,因为它是根据一周中的特定日期计算周数,因此按该天计算可能会得到 53 周。不是很好,但可以理解。

但是为什么 Postgres 经常说 12 月 31 日是一年的第一周呢?这有什么意义?

例子:

      SELECT EXTRACT(WEEK FROM DATE '2000-12-31') AS "Week",'Week2000' AS "Year"
UNION SELECT EXTRACT(WEEK FROM DATE '2001-12-31') AS "Week",'Week2001' AS "Year"
UNION SELECT EXTRACT(WEEK FROM DATE '2002-12-31') AS "Week",'Week2002' AS "Year"
UNION SELECT EXTRACT(WEEK FROM DATE '2003-12-31') AS "Week",'Week2003' AS "Year"
UNION SELECT EXTRACT(WEEK FROM DATE '2004-12-31') AS "Week",'Week2004' AS "Year"
UNION SELECT EXTRACT(WEEK FROM DATE '2005-12-31') AS "Week",'Week2005' AS "Year"
UNION SELECT EXTRACT(WEEK FROM DATE '2006-12-31') AS "Week",'Week2006' AS "Year"
UNION SELECT EXTRACT(WEEK FROM DATE '2007-12-31') AS "Week",'Week2007' AS "Year"
UNION SELECT EXTRACT(WEEK FROM DATE '2008-12-31') AS "Week",'Week2008' AS "Year"
UNION SELECT EXTRACT(WEEK FROM DATE '2009-12-31') AS "Week",'Week2009' AS "Year"
UNION SELECT EXTRACT(WEEK FROM DATE '2010-12-31') AS "Week",'Week2010' AS "Year"
UNION SELECT EXTRACT(WEEK FROM DATE '2011-12-31') AS "Week",'Week2011' AS "Year"
UNION SELECT EXTRACT(WEEK FROM DATE '2012-12-31') AS "Week",'Week2012' AS "Year"
UNION SELECT EXTRACT(WEEK FROM DATE '2013-12-31') AS "Week",'Week2013' AS "Year"
UNION SELECT EXTRACT(WEEK FROM DATE '2014-12-31') AS "Week",'Week2014' AS "Year"
UNION SELECT EXTRACT(WEEK FROM DATE '2015-12-31') AS "Week",'Week2015' AS "Year"
ORDER BY "Year"

结果:

Week   Year
-----  ---------
52     Week2000
1      Week2001
1      Week2002
1      Week2003
53     Week2004
52     Week2005
52     Week2006
1      Week2007
1      Week2008
53     Week2009
52     Week2010
52     Week2011
1      Week2012
1      Week2013
1      Week2014
53     Week2015

我已经测试过指定完整的时间戳,而不仅仅是日期,并且无论我在时间戳中包含一天中的哪个小时,结果都相同。

12 月 29 日和 30 日也可能产生 1、52 ​​或 53 个结果。

12 月 27 日和 28 日可能导致 52 或 53。

【问题讨论】:

标签: postgresql date


【解决方案1】:

PostgreSQL 使用 ISO8601 定义。这意味着周从星期一开始,一年中的第一周是 1 月 4 日所在的那一周。例如,如果 1 月 4 日是星期二,那么 12 月 31 日就是当年的第 1 周。

【讨论】:

  • 你可以把它想象成一个财政年度。 ISO8601 年不是从 1 月 1 日开始 - 它从星期一开始的任何一周开始,包含 1 月 4 日。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多