Oracle数据库中的时间类数据类型小结

网络整理 - 07-27

在ORACLE数据库中有一类比较特别的数据类型,它就是时间类的数据类型。这中数据类型表面上看看,像字符型的数据类型,但是又不是。因为他可以像数字型的数据类型那样,进行运算。所以说,他是兼有数字型与字符型数据类型的特点。掌握好时间型的数据类型,是掌握ORACLE数据库设计的一个必须具备的知识。因为在实际的数据库设计中,基本上没没张表都要用到这个数据类型。如信息化管理系统中的单据日期,就是一个时间型的数据类型。

  下面我对ORACLE数据库中的时间型的数据类型(包括日期类的数据类型)的操作技巧做一个小结,希望对大家有所帮助。

  第一个数据类型:DATE数据类型。

  在ORACLE以前的版本中,关于日期的数据类型就这么一个。可以说,这个DATE数据类型是这个数据库中元老级别的数据类型了。这个数据类型不要光看表面是个日期数据类型,其实,在存储数据的时候,这个数据类型不光是储存现在是几几年几月几号,而会储存几点几分几秒。也就是说,默认情况下,利用 DATE函数读取当前日期的话,其存储的格式是存储世纪(就是我们常说的公元)、年、月、日、时、分、秒。

  可是在大部分时候,我们不需要这么精确的日期或者时间。我们只需要年、月、日就可以了。该怎么处理呢?此时,我们可以利用Trunc函数来限制。

  另外还要注意两个默认的情况。如果我们在给一个日期型的字段赋值的时候,没有指定具体的时间,也就是说,我们假设字段“当前日期”为一个数据型的日期类型,我们给其赋值为2008年6月12日,则其存储在数据中不是2008年6月12日,而是2008年6月12日午夜00时00分00秒。也就是说,在保存时,数据库会自动把后面时间部分补上,并默认为午夜00时00分00秒。

  若我们给“当前日期”字段赋值是,只给其具体的时间,而没有给定具体的日期,又会如何呢。如我们给“当前日期”赋值的时候,给的是08时08分08秒。那是哪一天的08时08分08秒呢?默认情况下,不是当天的这个时刻,这要注意,而是当月的第一天的这个时刻。如我们是在6月分处理业务的时候,给予这个值的。我们系统存储的时候,在数据库中存储的就是 2008年6月1日08时08分08秒。而不是处理业务的日期。这一点我们在数据库设计的时候要引起充分的重视。

  另外,我们要以什么格式来显示时间呢?是日期放在前面还是时间放在前面呢?是用空格来进行区分还是用横杠来进行区分?是用24小时制呢还是采用12小时制?为了实现不同用户自己喜欢的格式来显示日期,数据库系统中提供了一些格式函数,如NTS_DATE_FORMATE函数或者TO_CHAR函数指定一个格式掩码来进行格式的转换。把系统格式转换成我们自己喜欢的格式。

  第二个数据类型:INTERVAL YEAR TO MOUNTH数据类型。

  如我们现在想知道,今天(2008年6月12日)离2008年8月8日还有几年几个月?在系统中就是利用这个字段来存储这个值。在官方资料上,对这个字段的解释是用年和月的形式存储一段时间。这个数据类型可以用来存储两个日期/时间之间的差值,只是其精确度不是很高,只会统计两个日期之间相差多少年多少月,而没有具体到日。

  第三个数据类型:INTERVAL DAY TO SECOND数据类型。

  有时候,我们计算两个日期的差值,若只是具体到月的话,可能还不能满足我们的需求。如现在奥运会的倒计时,就需要精确到具体的日子。在岁末倒计时的时候,我们需要的是精确到秒。所以,此时利用上面哪个数据类型来储存数据,明显精度不够,就要用到这个数据类型了。

  根据官方文档资料,这个字段是用天、时、分、秒的形式来存储一段时间。也就是说,我们若要知道2008年6月12日08时08分08秒离2008年8月8日8时8分07秒还差几天几分几秒,就需要利用这个字段来存储这个数据。

  不过有时候我们也不需要精确到具体的秒,而只要具体的时间。如想知道2008年6月12日离2008年8月8日还差几天,此时没有对应的数据类型来存储这个数据。我们只有先精确到秒,然后再用我们上面讲到的TRUNK割断函数,来取得具体相差的天数。或者利用格式函数来对显示的内容进行格式化,让起忽略后面具体的时间信息,而只精确到天数。

  在利用这个函数时,要注意,其显示的格式只会是说两个日期还会相差多少天,而不是会相差多少月多少天。若我们要实现这个需求,还是要利用相关的函数来进行转换。或者在存储的时候,直接以字符型的数据类型来进行存储。