Oracle对2位年份的处理

虽然Oracle数据存储了4位的年份,但是如果只提供2位数字,Oracle就会根据使用的格式是YY还是RR来解释世纪。

YY格式

如果日期中的年份采用的格式为YY,并且只提供了2位年份,那么就认为这一年世纪与数据库服务器上当前设置的世纪相同。因此,指定年份的前两位数字与前年份的前两位数据字相同。例如,如果提供的年份是14,而当前年份是2010年,那么提供的年份就是2014年,同理,如果提供年份是75,那么就是2075年。

如果日期中的年份使用YYYY格式,但是只提供了2位的年份,那么Oracle数据就会使用YY格式来解释。

下面来看一个查询,它在处理年份14和75时使用YY格式,在下面这个查询中,注意向TO_DATE函数输入的年份是14的75,其输出又被传递给TO_CHAR函数。后者又将日期转换成DD-MM-YY格式的字符串。

SQL> select to_char(to_date('<?xml:namespace prefix = st1 /><?xml:namespace prefix = st1 />04-05-14', 'dd-mm-yy'), 'dd-mm-yyyy'),

2 to_char(to_date('04-05-75', 'dd-mm-yy'), 'dd-mm-yyyy')

3 from dual

4 ;

TO_CHAR(TO_DATE('04-05-14','DD TO_CHAR(TO_DATE('04-05-75','DD

------------------------------ ------------------------------

04-05-2014 04-05-2075

RR格式

如果日期中年份采用的格式为RR,并且只提供了最后2位年份,那么年份中的前两位数字就由两部共同决定。提供年份的两位数字(指定年),数据库服务器上当前日期中年份的后2位数字(当年)。确定世纪的规则如下:

1:

如果指定年份在00-49之间,并且当前年份在00-49之间,那么指定年世纪就和当前年份世纪相同。如果指定01,当前是2010,那么指定年就为:2015

2:

如果指定年份在50-99之间,并且当前年份在00-49之间,那么指定年份世纪就等于当前年份的世纪减去1。如果指定是11,当前是2010,那么指定年就为:1911。

3:

如果指定年份在00-49之间,并且当前年份在50-49之间,那么指定年的世纪就是等于当前世纪加1。如果指定是为11,而当前年份是2055年,那么指定年就是2111年。

4:

如果指定年分在50-99之间,并且当前年在50-99之间,那么指定年的世纪就和当前年世纪相同。如果指定为51而当前年为2076年,那么指定年就2051年。

SQL> select to_char(to_date('04-05-14', 'dd-mm-rr'), 'dd-mm-yyyy'),

2 to_char(to_date('04-05-75', 'dd-mm-rr'), 'dd-mm-yyyy')

3 from dual

4 ;

TO_CHAR(TO_DATE('04-05-14','DD TO_CHAR(TO_DATE('04-05-75','DD

------------------------------ ------------------------------

04-05-2014 04-05-1975

select to_date('10-DEC-10 12:56:00','YYYY-MM-dd hh24:mi:ss','nls_date_language=American') from dual;

select to_char(to_date('10-DEC-10 12:56:00', 'dd-mm-rr hh24:mi:ss','nls_date_language=American'), 'yyyy-mm-dd hh24:mi:ss') from dual;


字符串拼接时,如 sql = 'update A表 set A.日期类型字段 = ' || 日期类型参数 || ,orcale会调用to_char 先将日期转换成字符串,然后再执行SQL语句。

而日期格式,to_char会使用session默认的nls_date_format, 我们目前的oracle默认为DD-MON-RR格式。当年份只有两位时,处于上半世纪还是下半世纪to_char会返回不同的值。详细的规则即是如上的RR,导致计算到期为 2088年,更新到字段后为1988年。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值