现在碰到这样一种情况,我需要做一个共通的查询界面,但是所查询的数据表里日期字段有的是定义成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无法结合起来写,但是目前情况是在一个已成熟的系统中做这件事,所以不能去修改数据库字段类型(这样会丢失数据,要是大家有既能修改字段类型,又不会丢失数据的方法,那就最好了),另一个就是查询界面是统一的,无法对不同的数据表分开来做。所以请教大家有什么解决办法!
举例
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无法结合起来写,但是目前情况是在一个已成熟的系统中做这件事,所以不能去修改数据库字段类型(这样会丢失数据,要是大家有既能修改字段类型,又不会丢失数据的方法,那就最好了),另一个就是查询界面是统一的,无法对不同的数据表分开来做。所以请教大家有什么解决办法!
可以不用改动你的数据库,将这些不统一的表做个相应的视图,查询你的视图即可.
2. 然后在用统一的方式查询就型了.
如都转换成VARCHAR2类型,那么就使用 TZSB.FACTORY_DATE >= '2005-05-07' 这种方式查询,
只需要将 ZD_SJBG表的EVENTDATE字段(定义成Date型的)在视图中转换成VARCHAR2类型,查询这个视图就型了.
...... where TZSB.FACTORY_DATE >= to_char(TO_DATE('2008-05-07', 'YYYY-MM-DD HH24:MI:SS')) ;试试这个。我在SI Object Browser的sql平台上能够成功。
这句,能执行,但结果是错误的
不过,还是期望有人能多提出一些其他的建议,让我学习一下,万一将来再碰到这问题,能有其他方法去解决。下礼拜一结贴
比如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,'...');
而这个格式应该和你所比较的目标字符串是一致的。
否则就会比不出你想要的结果。
在我使用的操作数据库工具(SI Object Browser)里,数值完全显示,结果是正确的。
但我在sqlplus里试了后,结果确实错了,不好意思。
只能显示日期,不能显示分秒。
是不是跟数据库的日期设置有关呀。
你说(TZSB.FACTORY_DATE >= '2005-05-07' )正确结果的,
我在sqlplus里试了,结果也只有日期,没有分秒,也不正确呀。