Oracle Date类型与SQLT_DAT分析
日期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.
 
阅读更多
个人分类: Oracle
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

Oracle Date类型与SQLT_DAT分析

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭