【问题标题】:oracle date format (auto convert)oracle 日期格式(自动转换)
【发布时间】: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 担任程序员的人交谈过。

标签: oracle date


【解决方案1】:

这在文档中有解释:http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm#i34924

字符串到日期转换规则
.....
.....

  • 如果日期时间格式元素与日期字符串中的相应字符匹配失败,则 Oracle 会尝试替代格式元素,如表 2-18 所示。
**Table 2-18 Oracle Format Matching**
Original Format Element | Additional Format Elements to Try in Place of the Original
------------------------|-----------------------------------------------------------
'MM'                    | 'MON' and 'MONTH'
'MON'                   | 'MONTH'
'MONTH'                 | 'MON'
'YY'                    | 'YYYY'
'RR'                    | 'RRRR'

根据上述情况,下面列出的所有转换都可以正常工作:

alter session set NLS_LANGUAGE='American';

select to_date('21-jan-2014',     'dd-month-yyyy' ) from dual;
select to_date('21-january-2014', 'dd-mon-yyyy' )   from dual;

select to_date('21-january-2014', 'dd-mm-rrrr' ) from dual;
select to_date('21-jan-2014',     'dd-mm-rrrr' ) from dual;

select to_date('21-01-2014', 'dd-mm-yy' )   from dual;
select to_date('21-01-14',   'dd-mm-yyyy' ) from dual;

select to_date('21-01-2014', 'dd-mm-rr' )   from dual;
select to_date('21-01-14',   'dd-mm-rrrr' ) from dual;


alter session set NLS_LANGUAGE='Polish';

select to_date('21-sty-2014',     'dd-month-yyyy' ) from dual;
select to_date('21-styczeń-2014', 'dd-mon-yyyy' ) from dual;

select to_date('21-styczeń-2014', 'dd-mm-rrrr' ) from dual;
select to_date('21-sty-2014',     'dd-mm-rrrr' ) from dual;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 2018-10-27
    相关资源
    最近更新 更多