【发布时间】:2015-11-24 18:04:52
【问题描述】:
我无法理解一个问题。
假设一个参数nls_date_format设置为dd-mon-rr,
那么如果有一个包含日期类型的列的表,我只能在语句看起来像这样的情况下插入数据:
insert into table values ('01-jan-00')
或 '01-january-00' 而不是 jan。无法插入日期 01-01-00(无效月份)。
在另一个站点上,当 nls_date_format 参数设置为 dd-mm-rr 时,我可以以 '01-jan-00' 或 '01-01-01' 甚至 '01-january-00' 的格式插入日期。没有无效的月份错误。那么它是如何工作的,oracle可以将日期从字符串(一月)转换为数字(01),但不能将日期从数字(01)转换为字符串(一月)?
【问题讨论】:
-
字符串
01应该转换为2001 年1 月还是该月的第一天?January不能是一个月或一年中的某一天。 -
我实际上认为这是一个没有实际意义的问题;在使用 DATE 或 TIMESTAMP 数据类型时,您应该从不依赖隐式转换;使用
to_date()/to_timestamp()或DATE/TIMESTAMP文字来显式转换日期和时间戳并不难! -
@ShannonSeverance 实际上,我对转换它没有任何兴趣。问题是为什么当 nls_date_format 为 dd-mon-yy 时插入日期 '05-01-00' 时会产生错误(期望字符串为月份但给定数字,因此产生错误,好的)但插入时没有错误当 nls_date_format 为 dd-mm-yy 时,日期为“05-jan-00”(期望数字为一个月,但给定字符串.. 并且没有错误?)
-
@Boneist 谢谢,我知道这个功能,我问是因为认证考试,那里有奇怪的问题;p
-
@luk_asz94,你问为什么。原因很可能是因为没有关于如何解释
01的明确信息,它是模棱两可的,并且创建 Oracle 的程序员决定引发错误而不是从他们的下层区域提取解释。他们还决定提供帮助并将January转换为January的月份,因为这样做是“安全的”。这都是推测性的,因为我从未与任何在 Oracle 担任程序员的人交谈过。