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年。




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

原文地址:https://www.cnblogs.com/zgqjymx/p/1976112.html