快速业务通道

浅析J2EE应用中的时间值字段的数据类 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
E_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结构

浅析J2EE应用中的时间值字段的数据类(5)

时间:2011-05-20

但由于使用了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

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号