日期date对应的oci类型为sqlt_dat,可以保存为7bytes。下面是一个日期类型保存的事例:
example (for 30-nov-1992, 3:17 pm)
----------------------------------------------------------
byte 1 2 3 4 5 6 7
----------------------------------------------------------
meaning century year month day hour minute second
values 119 192 11 30 16 18 1
----------------------------------------------------------
解释:
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年。
oracle oci 文档内容如下:
date
the date datatype can update, insert, or retrieve a date value using the oracle internal date binary format. a date in binary
format contains seven bytes, as shown in table 3-4.
table 3-4 format of the date datatype
byte 1 2 3 4 5 6 7
meaning century year month day hour minute second
example (for 30-nov-1992, 3:17 pm) 119 192 11 30 16 18 1
the century and year bytes (bytes 1 and 2) are in excess-100 notation. the first byte stores the value of the year, which is
1992, as an integer, divided by 100, giving 119 in excess-100 notation. the second byte stores year modulo 100, giving 192.
dates before common era (bce) are less than 100. the era begins on 01-jan-4712 bce, which is julian day 1. for this date, the
century byte is 53, and the year byte is 88. the hour, minute, and second bytes are in excess-1 notation. the hour byte
ranges from 1 to 24, the minute and second bytes from 1 to 60. if no time was specified when the date was created, the time
defaults to midnight (1, 1, 1).
when you enter a date in binary format using the date external datatype, the database does not do consistency or range
checking. all data in this format must be carefully validated before input.
阅读(4627) | 评论(0) | 转发(0) |