现在碰到这样一种情况,我需要做一个共通的查询界面,但是所查询的数据表里日期字段有的是定义成String型,有的是定义成Date型,我该怎么写才能检索成功。
举例
ZD_SJBG表的EVENTDATE字段是定义成Date型的

ZD_SJBG.EVENTDATE >= TO_DATE('2008-05-07', 'YYYY-MM-DD HH24:MI:SS')这样检索它,出来的结果是对的
to_char(ZD_SJBG.EVENTDATE) >= TO_DATE('2008-05-07', 'YYYY-MM-DD HH24:MI:SS') 这样结果也是对的
to_char(ZD_SJBG.EVENTDATE) >= '2008-05-07' 这样就出问题了,检索出来结果不对另外TZSB表的FACTORY_DATE字段是定义成VARCHAR2型的
TZSB.FACTORY_DATE >= TO_DATE('2008-05-07', 'YYYY-MM-DD HH24:MI:SS')这样语法通不过
to_char(TZSB.FACTORY_DATE) >= TO_DATE('2008-05-07', 'YYYY-MM-DD HH24:MI:SS')这样也语法通不过
to_char(TZSB.FACTORY_DATE) >= to_char(TO_DATE('2008-05-07', 'YYYY-MM-DD HH24:MI:SS'))结果错误
TZSB.FACTORY_DATE >= to_char(TO_DATE('2008-05-07', 'YYYY-MM-DD HH24:MI:SS')) 结果错误
TZSB.FACTORY_DATE >= '2005-05-07' 这样结果是对的总而言之,我sql无法结合起来写,但是目前情况是在一个已成熟的系统中做这件事,所以不能去修改数据库字段类型(这样会丢失数据,要是大家有既能修改字段类型,又不会丢失数据的方法,那就最好了),另一个就是查询界面是统一的,无法对不同的数据表分开来做。所以请教大家有什么解决办法!

解决方案 »

  1.   

    to_char(字段名)=to_char(查询条件字符串) 如果查询条件是字符串的后面就不用to_char了,不管是日期类型的字段还是字符串类型的字段都可以用to_char转换成字符串。
      

  2.   

    1.把数据库中所有涉及到的日期转换为统一的格式,要么都是Date要么都是Varchar2类型,
    可以不用改动你的数据库,将这些不统一的表做个相应的视图,查询你的视图即可.
    2. 然后在用统一的方式查询就型了.
    如都转换成VARCHAR2类型,那么就使用 TZSB.FACTORY_DATE >= '2005-05-07' 这种方式查询,
    只需要将 ZD_SJBG表的EVENTDATE字段(定义成Date型的)在视图中转换成VARCHAR2类型,查询这个视图就型了. 
      

  3.   

    ...... where ZD_SJBG.EVENTDATE >=  to_char(TO_DATE('2008-05-07', 'YYYY-MM-DD HH24:MI:SS')),
    ...... where TZSB.FACTORY_DATE >=  to_char(TO_DATE('2008-05-07', 'YYYY-MM-DD HH24:MI:SS')) ;试试这个。我在SI Object Browser的sql平台上能够成功。
      

  4.   

    4楼的,where TZSB.FACTORY_DATE >=  to_char(TO_DATE('2008-05-07', 'YYYY-MM-DD HH24:MI:SS')) ; 
    这句,能执行,但结果是错误的
      

  5.   

    目前,用最土的方法解决的,因为大多数表都是date型,只有一两个表是varchar型,所以就新建一个字段,把数据复制过去,然后清空原字段数据,修改其格式为date型,再把数据复制回来。然后删除那个临时新建的字段。
    不过,还是期望有人能多提出一些其他的建议,让我学习一下,万一将来再碰到这问题,能有其他方法去解决。下礼拜一结贴
      

  6.   

    一般比较日期型使用to_char以后的结果比较有精度上的问题。
    比如to_char(sysdate,'yyyymmdd') = to_char(sysdate-1/24,'yyyymmdd')。
    这是因为你在o_char时指定的格式不包含时分秒。
    不过这要看你得业务需求是什么,如果只要求到日就没有关系。
    下面谈谈你的需求,我觉得描述的不明确。
    你要开发的是什么东西呢?一个类似Object Browser的东西?
    如果不是,那说明你在开发的时候是事先知道到每个字段字段类型的。
    所以与传入参数比较的时候就容易多了。对于date型的字段,假使你指需要比较年月日,传入参数的格式是2008-05-09
    to_char(col,'YYYY-MM-DD') < '2008-05-09'
    即可,如果要找有时分秒精度,则:
    col < to_date('2008-05-09','YYYY-MM-DD')
    对于varchar2类型的字段原理类似。
    需要说明的是,不建议你用date型直接与varchar2作比较,
    这样Oracel会进行隐式的类型转换,而这种转换成功与否是未知的。
    他可能却取决于你得数据库服务器的默认自其格式。
    还有就是如果你用to_char对日期型作转换,一定要指定日期格式to_char(col,'...');
    而这个格式应该和你所比较的目标字符串是一致的。
    否则就会比不出你想要的结果。
      

  7.   


    在我使用的操作数据库工具(SI Object Browser)里,数值完全显示,结果是正确的。
    但我在sqlplus里试了后,结果确实错了,不好意思。
      

  8.   


    只能显示日期,不能显示分秒。
    是不是跟数据库的日期设置有关呀。
    你说(TZSB.FACTORY_DATE >= '2005-05-07' )正确结果的,
    我在sqlplus里试了,结果也只有日期,没有分秒,也不正确呀。