您的位置:首页 > 数据库 > Oracle

select语句(4)--Oracle中的日期格式及千年虫问题

2016-09-16 21:35 931 查看
一、日期格式及表示的含义:

          yyyy:四位数的年份

          rrrr:四位数的年份

          yy:两位数的年份

          rr:两位数的年份

          mm:两位数的月份(数字)

          D:一周的星期几

          DD:一月的第几天

          DDD :一年的第几天

          YEAR:英文的年份

          MONTH:英文全称的月份

          mon:英文简写的月份

          ddsp:英文的第几天(一个月的)

          ddspth:英文序列数的第几天(一个月的)

          DAY:全英文的星期

          DY:简写的英文星期

          hh:小时

          mi:分钟

          ss:秒

 二、千年虫问题(参见:千年虫问题的发现者及相关)

      千年虫:

        在早期的计算机的程序中规定了的年份仅用两位数来表示。也就是说,假如是1971年,在计算机里就会被表示为71,但是到了2000年的时候这个情况就出现了问题,计算机就会将其年份表示为00。这样的话计算机内部对年份的计算就会出现问题。这个事情当时被称为千年虫     

        数据库中表示日期中年份的有俩种: yy和rr

        之前一直使用的是yy格式,后来才有的rr格式

        yy表示使用一个俩位数表示当前年份:

        1990 ---yy数据库格式---> 90

        1968 ---yy数据库格式---> 68

        1979 ---yy数据库格式---> 79         
        rr格式表示: 另外参照图片:rr日期格式规则.png

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



   确定指定年所在世纪的规则如下:

        规则1 如果指定年在00~49之间,并且当前年份在00~49之间,那么指定年的世纪就与当前年份的世纪相同。因此,指定年的前两位数字就等于当前年份的前两位数字。例如,如果指定年为15,而当前年份为2007,那么指定年就是2015。

        规则2 如果指定年在50~99之间,并且当前年份在00~49之间,那么指定年的世纪就等于当前年份的世纪减去1。因此,指定年的前两位数字等于当前年份的前两位数字减去1。例如,如果指定年为75,而当前年份为2007,那么指定年就是1975。

        规则3 如果指定年在00~49之间,并且当前年份在50~99之间,那么指定年的世纪就等于当前年份的世纪加上1。因此,指定年的前两位数字等于当前年份的前两位数字加上1。例如,如果指定年为15,而当前年份为2075,那么指定年就是2115。
        规则4 如果指定年在50~99之间,并且当前年份在50~99之间,那么指定年的世纪就与当前年份的世纪相同。因此,指定年的前两位数字就等于当前年份的前两位数字。例如,如果指定年为55,而当前年份为2075,那么指定年就是2055。

如下所示,日期中的年份采用的格式为rr,并且只提供了最后2位年份      

select to_char(to_date('25-may-12','dd-month-rr'),'yyyy-mm-dd') from dual;




如上图所示,由于指定的两位数字为12,当前年份的后两位数字位16(今年是2016年),所以指定年属于0-49的范围,而当前年也属于0-49的情况,所以属于规则1,这时数据库就以规则1的形式存储指定年的年份为2012,故当我们使用四个年份长度的‘yyyy’读取时,便显示2012     

select to_char(to_date('25-may-72','dd-month-rr'),'yyyy-mm-dd') from dual;





如上图所示,由于指定的两位数字为72,当前年份的后两位数字位16(今年是2016年),所以指定年72属于50-99的范围,而当前年16属于0-49的情况,所以属于规则2,这时数据库就以规则2的形式存储指定年(此时的指定世纪为当时世纪减1,即19)的年份为1972,故当我们使用四个年份长度的‘yyyy’读取时,便显示1972

如下面所示,我把我的系统时间手动更改为2076年9月20日,由于我的是本地oracle数据库,所以 数据库的本地时间也会跟随系统变化        

select to_char(to_date('25-may-72','dd-month-rr'),'yyyy-mm-dd') from dual;





如上图所示,由于指定的两位数字为72,当前年份的后两位数字为76(即oracle获取的本地时间(当前时间)是2076年),所以指定年72属于50-99的范围,而当前年76也属于50-99的情况,所以属于规则4,这时数据库就以规则4的形式存储指定年(此时的指定世纪为当前世纪,即20)的年份为2072,故当我们使用四个年份长度的‘yyyy’读取时,便显示2072      

select to_char(to_date('25-may-12','dd-month-rr'),'yyyy-mm-dd') from dual;







如上图所示,由于指定的两位数字为12,当前年份的后两位数字为76(即oracle获取的本地时间(当前时间)是2076年),所以指定年12属于0-49的范围,而当前年76属于50-99的情况,所以属于规则3,这时数据库就以规则3的形式存储指定年的年份为2172[b](此时的指定世纪为当前世纪+1,即21),故当我们使用四个年份长度的‘yyyy’读取时,便显示2112[/b]

三、oracle数据库中表示一个日期数据的几种方式

      1.使用sysdate,表示当前日期

      2.使用oracle默认的日期格式 例如:'25-MAY-95'

      3.使用日期函数ADD_MONTHS/NEXT_DAY/LAST_DAY/ROUND/TRUNC

      4.使用转换函数to_date,使用是注意格式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: