使用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)
答案 0 :(得分:7)
IYYY
指的是指定日期的星期几。
2013年第一周于2012年12月31日星期一开始,因此问题中的奇怪结果是正确的。
manual中有与此直接相关的警告:
尝试使用ISO周和ISO的混合构建日期 格里高利日期字段是荒谬的,会导致错误。在里面 ISO年份的背景,“月”或“月日”的概念具有 没意思。在格里高利年的背景下,ISO周没有 含义。用户应避免混合格里高利和ISO日期 规格。
有关详细信息,另请参阅维基百科iso week date文章。