设为首页 | 收藏本站
首页>IT学院>软件编程>正文
浅析J2EE应用中的时间值字段的数据类型
WWW.DBIT.CN 2006-9-23 9:08:31 热度:
 

1)去除格式符:2001,200202

2)补尾串:20010000,20020299

3)构造查询SQL:

select * from T_USER where EXPIRE_DATE between '20010000'and '20020299'

又如开始日期为空,结束日期为200203,则对应的查询SQL为:

select * from T_USER where EXPIRE_DATE between '00000000'and '20020399'

·DATE类型日期

由于DATE类型日期在数据库表中对应的是Date类型字段,首先,我们不能仿照CHAR类型日期的查询SQL结构构造如下的查询SQL:

select * from T_USER where to_char(EXPIRE_DATE,'yyyymmdd') between <开始日期> and <结束日期>

因为在EXPIRE_DATE上建立了索引,如果在EXPIRE_DATE施加了to_char()的数据库函数,就无法使用该索引,将引发一个全表描述。

所以,还得将开始、结束日期字符串用to_date()数据库函数转换为Date类型,如:

select * from T_USER where EXPIRE_DATE between to_date(<开始日期>,'yyyymmdd') and to_date(<结束日期>,'yyyymmdd')

表 2 CHAR类型日期查询SQL结构

但由于使用了to_date字符串日期转换函数,就必须保证开始日期和结束日期的字符串必须是语义合法日期字符串,如20010101,20020228,如果是语义错误的日期字符串,如20010000,20020299,to_date函数将发生转换错误,致使上面的查询SQL语句运行错误。因此,只有开始日期和结束日期字符串都合法时,才可以使用上式的查询SQL。

如果开始或结束日期未精确到日,即只精通到年或月,如2001,200202,则在应用程序的服务层,必须对日期串进行语义分析,将其补齐到8位合法日期字符串,如开始日期字符串"2001"就必须补齐为"20010101",而结束日期字符串"200202"就必须先补齐为"20020228"(非润年的平月),而这一转换逻辑处理起来是比较费神费力的,一不小心就可能引入一个Bug。

第二个麻烦的问题是,如果开始日期和结束日期为空,SQL语句又该如何构造呢?如果还按照表 2的SQL结构进行构造,那么就必须回答一个问题:最小开始日期和最大的结束日期分别是多少,因为你不能用"00000000"来代表最小的日期,也不能用"99999999"来代表最大的日期。

为了避免回答这个问题,就需要在开始日期和结束日期为空时分别采用不同结构的查询SQL语句:

select * from T_USER where EXPIRE_DATE >= to_date(<开始日期>,'yyyymmdd') 表 3 结束日期条件值为空时

select * from T_USER where EXPIRE_DATE <= to_date(<结束日期>,'yyyymmdd') 表 4 开始日期条件值为空时

综上所述,为了使用在EXPIRE_DATE字段上的索引,DATE类型日期在构造查询SQL上明显比CHAR类型日期复杂,具体表现在以下两点:

1) 需要对日期条件值进行语义分析,以得到精确到日的语义合法的日期字符串。

2) 需要为开始/结束日期条件值均不为空,开始日期条件值为空,结束日期条件值为空三种情况分别构造不同结构的SQL语句,也构造SQL的程序必须对应一个分支。

5、在数据库移植上的比较

由于CHAR类型日期实际上是一个字符类型字段,字符类型是最基本的数据类型,在构造Insert ,Update,Delete,Selete的SQL时,各种数据库对字符类型字段的处理几乎一致,因此在数据库的移植上比较容易。

对于DATE类型的日期,由于不同数据库对日期的操作差异很大,如获取数据库的时间函数,Oracle为sysdate,SqlServer为getdate(),而MySql为now();从Date字段中抽取年的数值,Oracle为extract(year from <date>),SqlServer和MySql均为month(<date>)。由于日期函数在不同数据库差别巨大,带DATE类型日期字段的表在数据库的移植上就不如CHAR类型日期来得简单易行。

也许,有人会说现在都采用Hibernate进行映射ORM了,Hibernate已经屏蔽了具体数据库的不同,何来的数据库移植?这话在一定程度上是没有错的,但是Hibernate框架由于通过对象映射的方法产生SQL语句,有时往往很难获得最优的查询性能的SQL语句。所以,对于一些有性能要求较高的查询,往往采用直接编写SQL语句,或采用iBatis框架,后两者都需要直接使用SQL语句,此时数据库的移植问题就暴露出来了。

本新闻共5页,当前在第4页  1  2  3  4  5  

 
上一篇:用XMLHTTP组件解析图片地址并保存
下一篇:Java语言中链表和双向链表的实现
打印】【关闭
  相关文章:
☆联姻学院☆

保养电脑的26个窍门
文件夹删除不掉怎么办?
教你如何用手工迅速剿灭QQ广告
“熊猫烧香”病毒的病毒描述和
在Excel中只打印图表以外区域
Excel中只选中包含文本的单元
Windows XP操作系统的几个实用
用XP系统自带网络诊断程序解决
风雨雷电→自然现象动画实战技
Flash遮罩特效之百叶窗效果
十二个Dreamweaver鲜为人知的
如何用 Dreamweaver 批量做we
JavaScript的系统函数学习
Java之父:关于Java我也有遗憾
排除网上邻居使用4大常见麻烦
解除上网限制IP和MAC捆绑的破