• Oracle根蒂根基数据典范存储格局浅析(三)——日期典范(一)


     起原:yangtingkun.itpub.net  




    这篇文章形貌DATE典范的数据在Oracle中因此何莳格局存放的。

    下面经由历程一个例子举行理会。

     


    SQL> create table test_date (date_col date);

    表已创立。

    SQL> insert into test_date values (to_date('2000-1-1 0:0:0', 'yyyy-mm-dd hh24:mi:ss'));

    已创立 1 行。

    SQL> insert into test_date values (to_date('1-1-1 0:0:0', 'yyyy-mm-dd hh24:mi:ss'));

    已创立 1 行。

    SQL> insert into test_date values (to_date('-1-1-1 0:0:0', 'syyyy-mm-dd hh24:mi:ss'));

    已创立 1 行。

    SQL> insert into test_date values (to_date('-101-1-1 0:0:0', 'syyyy-mm-dd hh24:mi:ss'));

    已创立 1 行。

    SQL> insert into test_date values (to_date('-4712-1-1 0:0:0', 'syyyy-mm-dd hh24:mi:ss'));

    已创立 1 行。

    SQL> insert into test_date values (to_date('9999-12-31 23:59:59', 'syyyy-mm-dd hh24:mi:ss'));

    已创立 1 行。

    SQL> insert into test_date values (sysdate);

    已创立 1 行。

    SQL> insert into test_date values (to_date('-4713-1-1 0:0:0', 'syyyy-mm-dd hh24:mi:ss'));
    insert into test_date values (to_date('-4713-1-1 0:0:0', 'syyyy-mm-dd hh24:mi:ss'))
                                          *
    ERROR 位于第 1 行:
    ORA-01841: (全)年度值必须介于 -4713 和 9999 之间,且不为 0


    SQL> insert into test_date values (to_date('0000-1-1 0:0:0', 'yyyy-mm-dd hh24:mi:ss'));
    insert into test_date values (to_date('0000-1-1 0:0:0', 'yyyy-mm-dd hh24:mi:ss'))
                                          *
    ERROR 位于第 1 行:
    ORA-01841: (全)年度值必须介于 -4713 和 9999 之间,且不为 0


    SQL> col dump_date format a80
    SQL> select to_char(date_col, 'syyyy-mm-dd hh24:mi:ss'), dump(date_col) dump_date from test_date;

    TO_CHAR(DATE_COL,'SY DUMP_DATE
    -------------------- ---------------------------------------
     2000-01-01 00:00:00 Typ=12 Len=7: 120,100,1,1,1,1,1
     0001-01-01 00:00:00 Typ=12 Len=7: 100,101,1,1,1,1,1
    -0001-01-01 00:00:00 Typ=12 Len=7: 100,99,1,1,1,1,1
    -0101-01-01 00:00:00 Typ=12 Len=7: 99,99,1,1,1,1,1
    -4712-01-01 00:00:00 Typ=12 Len=7: 53,88,1,1,1,1,1
     9999-12-31 23:59:59 Typ=12 Len=7: 199,199,12,31,24,60,60
     2004-12-15 13:56:19 Typ=12 Len=7: 120,104,12,15,14,57,20

    已选择7行。

     

    经由历程最后两条语句已经可以看出Oracle的DATE典范的取值规模是公元前4712年1月1日至公元9999年12月31日。而且凭证日期的特定,要不然是公元1年,要不然是公元前1年,不会出现0年的景遇。

    日期典范长度是7,7个字节别离浮现世纪、年、月、日、时、分和秒。

    因为不会出现0的景遇,月和日都是凭证原值存储的,月的规模是1~12,日的规模是1~31。

    因为时、分、秒都市出现0的景遇,因此存储时接纳原值加1的方法。0时保管为1,13时保管为14,23时保管为24。分和秒的景遇与小时相通。小时的规模是0~23,在数据库中以1~24保管。分和秒的规模都是0~59,在数据库中以1~60保管。

    年和世纪的景遇相对对照重大,可分为公元前和公元后两种景遇。因为最小的世纪的值是-47(公元前4712年),最大值是99(公元9999年)。为了避免正数的孕育发生,oracle把世纪加100保管在数据库中。公元2000年,世纪保管为120,公元9999年,世纪保管为199,公元前101年,世纪保管为99(100 (-1)),公元前4712年,世纪保管为53(100 (-47))。

    仔细,关于公元前1年,固然已经是公元前了,但是浮现世纪的前两位的值依然是0,因此,这时的保管的世纪的值依然是100。世纪的规模是-47~99,保管的值是53~199。

    年的保管与世纪的保管方法相通,也把年的值加上100举行保管。关于公元2000年,年贯串毗连为100,公元1年保管为101,公元2004年保管为104,公元9999年保管为199,公元前1年,保管为99(100 (-1)),公元前101年,保管为99(100 (-1)),公元前4712年保管为88(100 (-12))。关于公元前的年,保管的值总是小于即是100,关于公元后的年,保管的值总是大于即是100。年的规模是0~99,保管的值是1~199。

    仔细:一样粗浅的世纪,都收罗了100年,而关于0世纪,因为收罗公元前和公元后两部分且不收罗0年,因此收罗了198年。




    版权声明: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。不然将追查法律责任。

  • 相关阅读:
    幻灯片效果
    国外空间乱码的解决方法
    图片自动适应
    css圆角效
    iframe自适应兼容
    css圆角
    图片自动适应2
    JQuery实现智能输入提示(仿机票预订网站)
    AppDiag类
    c# 渐变算法
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1976112.html
Copyright © 2020-2023  润新知