登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

梦想之鹰的天空

天高任鸟飞......放飞....心情..........放飞.....梦想

 
 
 

日志

 
 

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

2008-08-10 22:16:32|  分类: 数据库 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在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割断函数,来取得具体相差的天数。或者利用格式函数来对显示的内容进行格式化,让起忽略后面具体的时间信息,而只精确到天数。

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

 第一个函数:datetimezone函数。

  顾名思义,这个函数的意思就是时区的意思。返回当前系统所采用的时区。这个功能在一些跨国度的系统应用上比较广泛。如现在有一个企业资源计划系统,是为一个集团企业所部署的。这个集团企业,不仅在美国有办事处,而且在中国也有生产工厂,在日本也有自己的销售办事处。现在利用企业资源计划系统把这几个不同国度的办事处及生产工厂有机的联系在了一起。此时,各个办事处或许都要采用自己所在地方的时区。现在的问题是,美国的销售办事处下了一张销售定单,销售定单的交货日期是美国时间2008年8月10日。但是,在中国的生产工厂中看到的就应该是按照中国北京时间转换的日期。这个需求该如何实现呢?就是要用到这个datetimezone函数。先从当前系统中利用这个函数取得系统这张单据日期所采用的时区,然后再根据相关规则进行转换。

  所以,这个函数在这些跨集团的信息化管理系统的应用上,用的非常广泛。

  另外,也可以采用NEW—TIME函数结合其他相关的函数实现这个功能。

  第二个函数:Sysdate函数。

  这个函数是用来获取当前的系统日期。默认情况下,利用这个函数显示的日期格式为“月-日-年 星期几”。若我们要以其他格式进行显示,我们就需要用到格式转换类型,如TO-CHAR函数来转换我们自己需要的类型。

  这个函数在实际应用中还是非常广泛的。

  如我们新建一张销售定单的日期,建立定单的日期我们一般需要为其设立一个默认日期,这个日期不是当前系统的日期就是服务器的当前系统日期。而要获得这个日期的话,都是需要用到这个SYSDATE系统函数。

  如在一些项目管理系统中,需要知道离某个具体的任务还有多少时间,具体的算法就是将来某个日期减去当前日期还剩多少天。在这个计算的过程中,也需要用到SYSDATE函数,用来取得系统的当前日期。

  另外这里还要注意一个问题。有些人在数据库设计的时候,喜欢把取得的当前日期通过数据类型转换函数,把日期型的数据转换为字符型的数据。这我个人认为是一个不好的习惯。

  第三个函数:MOUNTS_BETWEEN函数。

  上面我们在谈到数据类型的时候,说到过一个需求,有时候我们需要知道2008年6月12日到2008年8月8日还剩几个过。此时,就是利用MOUNTS_BETWEEN函数来获取这个信息,并利用INTERVAL YEAR TO MOUNTH数据类型的字段来储存这个信息。

  这个函数的话,在一些项目管理系统中用的也比较频繁。有时候一个项目可能时间比较久,我们采用的精度是月而不是天。此时就要利用这个函数来计算两个具体日期之间还相差几个月。

  给与日期操作的函数还有很多。如有时候我们需要知道,今年的母亲节是什么时候。根据中国的习俗,5月分的第二个星期日就是母亲节。若我们通过日历查找出这个日期,那没有什么难度。现在我们若希望能够通过数据库,计算出这个日期。此时,就需要用用到数据库的日期操作函数,实现这个需求。类似的情况很多,如我们想知道2008年的5月1日劳动节,那天是星期几,以方便我们安排假期。这些需求的都是通过日期函数来解决的。今天在这里由于篇幅的限制,不做过多的解释。在后续数据库的设计中,遇到具体的应用,我们再做深入的阐述。

  评论这张
 
阅读(332)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018