在PostgreSQL中使用IYYY进行日期格式化会产生奇怪的结果

Rap*_*hDG 3 postgresql iso date

使用IYYY和YYYY格式化日期:

SELECT to_char( '2012-12-31'::DATE, 'IYYY-MM-DD' ) AS weird,
       to_char( '2012-12-31'::DATE, 'YYYY-MM-DD' ) AS expected;
Run Code Online (Sandbox Code Playgroud)

结果:

   weird    |  expected  
------------+------------
 2013-12-31 | 2012-12-31
Run Code Online (Sandbox Code Playgroud)

它不会是这个感到惊讶,如果"怪异"的结果是"2013-01-01".

这有什么不对?(PostgreSQL 9.1.7)

Dan*_*ité 8

IYYY 指指定日期的星期几.

2013年第一周从2012年12月31日星期一开始,所以问题中的奇怪结果是正确的.

有直接关系,这一点在警告手册:

尝试使用ISO周和格里高利日期字段的混合构造日期是没有意义的,并且会导致错误.在ISO年份的背景下,"月"或"月份日"的概念没有意义.在格里高利年的背景下,ISO周没有意义.用户应避免混合使用Gregorian和ISO日期规范.

有关许多详细信息,另请参阅维基百科iso周日期文章.