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

时间:2013-01-22 14:42:43

标签: postgresql date iso

使用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;

结果:

   weird    |  expected  
------------+------------
 2013-12-31 | 2012-12-31

如果“怪异”的结果是“2013-01-01”,那么这个就不会感到惊讶。

这里有什么问题? (PostgreSQL 9.1.7)

1 个答案:

答案 0 :(得分:7)

IYYY指的是指定日期的星期几。

2013年第一周于2012年12月31日星期一开始,因此问题中的奇怪结果是正确的。

manual中有与此直接相关的警告:

  

尝试使用ISO周和ISO的混合构建日期   格里高利日期字段是荒谬的,会导致错误。在里面   ISO年份的背景,“月”或“月日”的概念具有   没意思。在格里高利年的背景下,ISO周没有   含义。用户应避免混合格里高利和ISO日期   规格。

有关详细信息,另请参阅维基百科iso week date文章。