【问题标题】:Oracle SQL - Why does select to_char(to_date('31-DEC-18'),'YYYY-IW') from dual; return 2018-01?Oracle SQL - 为什么选择 to_char(to_date('31-DEC-18'),'YYYY-IW') from dual;返回 2018-01?
【发布时间】:2019-06-07 14:26:20
【问题描述】:

使用Oracle SQL时,为什么会出现select语句

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。

【问题讨论】:

  • 文档中没有任何内容表明日期格式的结果是有意义的。格式的每个部分都独立工作。年?现在是 2018 年。iso 周?它是 01。你想把它组合成一个字符串吗?没问题。

标签: sql oracle


【解决方案1】:

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

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'

【讨论】:

  • 谢谢你,Aleksej!这正是我正在寻找的。我没有意识到有 ISO 年份格式。 ISO 标准对我来说是一个新概念。
  • @KatherineReed - 格式模型中的日期元素始终相互独立。 'YYYY' 适用于 日历 年,在您的示例中是 2018 年(显然!)。 'IW' 代表 ISO 周;该日期位于 ISO 2019 年的第一个 ISO 弱点(即使 日历 年仍然是 2018 年)。要获得 ISO 年份 - 这是唯一一个有意义的与 ISO 周数一起显示的年份 - 您需要格式元素“IYYY”。在格式模型中使用兼容的元素,如 IYYY 和 IW 是您(程序员)的责任; Oracle 不够聪明,无法为您做这件事。
【解决方案2】:

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

您可能需要查看 ISO 周和年的规则,例如 Wikipedia。

【讨论】:

  • 感谢您的回复。我了解 ISO 2019 年于 2018 年 12 月 31 日开始,但 select 语句并未返回该年的 2019 年。今年又回到了 2018 年,我不明白为什么。
猜你喜欢
  • 1970-01-01
  • 2019-03-05
  • 2018-06-17
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多