Oracle SQL-为什么从双中选择to_char(to_date('31 -DEC-18'),'YYYY-IW');返回2018-01?

时间:2019-06-07 14:26:20

标签: sql oracle

使用Oracle SQL时,为什么选择语句

select to_char(to_date('31-DEC-18'), 'YYYY-IW') 
from dual;

返回“ 2018-01”?

我了解“ IW”使用的是我想使用的ISO标准,但是据我的研究可知,根据ISO标准,2018年12月31日发生在2019年的第1周。所以我理解为什么select语句为“ IW”返回“ 01”,但是为什么它为“ YYYY”返回“ 2018”?语句不应该返回'2019-01'吗?

对于我使用的数据,最好使用IW而不是WW。

2 个答案:

答案 0 :(得分:6)

根据Oracle documentation,您可能需要的是ISO年份格式IYYY

SQL> select to_char( date '2018-12-31', 'IYYY-IW')
  2  from dual;

TO_CHAR
-------
2019-01

顺便说一句,通过编写to_date('31-DEC-18'),您所依据的是一些假设,这些假设可能并不总是正确的。日期的一种更安全的写法是ANSI格式:date '2019-12-31'

答案 1 :(得分:1)

ISO年份2019从2018年12月31日开始。所有星期从星期一开始,按照所使用的规则,即2019年的第一周。Oracle正确进行了计算。 ISO日期在线有方便的references

您可能想查看ISO周和年的规则,例如在Wikipedia中说。