queryStr = " select  * from VIP_SMGROUP  where  SENDDT>='"+ksrq+"'  AND SENDDT <='"+jsrq+"' ";
//queryStr1 = " select  * from VIP_SMGROUP ";DBConnManager db = new DBConnManager();
Connection conn = db.getConnection("Oracle");
Statement stmt = null;
ResultSet rs = null;                try {
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
ArrayList<SMGroupLog> smgrouplogquerylist = new ArrayList<SMGroupLog>(); while (rs.next()) {
System.out.println("有记录");   
SMGroupLog smgrouplog = new SMGroupLog();
smgrouplog.setSerial_num(rs.getString(1));
System.out.println("姓名"+rs.getString(2));   
smgrouplogquerylist.add(smgrouplog);
}
                  System.out.println("记录条数"+smgrouplogquerylist.size());   

} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}非常妖怪,字段"SENDDT"是VARCHAR2类型,变量是String类型的
使用变量queryStr的SQL语句,就是执行结果为空,而语句queryStr1对应的语句正常,实际上queryStr的SQL语句是有记录的
其语句在oracle中执行正常有结果是什么缘故呢?一个string变量参数比较而已呀?

解决方案 »

  1.   

    日期格式不对吧"select * from VIP_SMGROUP where SENDDT between to_date('"+ksrq+"','yyyy-mm-dd') and to_date('"+jsrq+"','yyyy-mm-dd')"
      

  2.   

    你把where后边的条件拆开看看,看看有一个条件的时候,能查到么?
    另外,是不是和字段的大小写有关系?
      

  3.   

    我的字段SENDDT是VARCHAR2类型的
    变量ksrq是String类型的
    难道字符串类型不能直接比较吗?
    我的日期时间是转为字符串类型存放在数据库中的,目的就是为了方便比较
      

  4.   


    目的就是为了方便比较 
    ……………………对于你这句我十分无语,难道数据库的设计人员会设计一个很麻烦的日期类型吗?如果日期型真的那么不方便,谁还会用?ORACLE ,DB2的日期类型早就会删掉了,谁愿意用一个很麻烦的类型?
    把日期存成字符型会有很多很多麻烦,会给程序带来很多隐患。
      

  5.   

    字符串在oracle里面是可以比较大小的,问题可能是你的ksrq和jsrq与数据库中字段的长度不对,打印出来看看,如果长度短了要补齐成一样的位数
      

  6.   


    谢谢你的指导和批评.
    我在建立表的时候,该date类型还是date类型的,并没有说这个类型不好
    发送时间之所以使用19位的VARCHAR2类型,目的是用在页面上,用户输入的日期格式都是字符串获得的,所以我想不转化为date类型而可以直接比较
    现在我数据库里面存放的是字符串格式的,比如: '20120426 12:30:59'
    这样的字符串在java中居然比较失败,我很纳闷
      

  7.   


    长度是一致的:
    打印出来
    开始时间:20120101 00:00:00
    结束时间:20120426 23:59:59
    查询语句: SELECT  * from VIP_SMGROUP WHERE SENDDT BETWEEN '20120101 00:00:00' AND '20120426 23:59:59' 
    记录条数0之际上,上面的在外面的环境中语句执行出来是有记录的
    你说奇怪吗?但是我使用'20120426123059'这样的格式就可以比较了
      

  8.   

    我现在做的项目,有个已经辞职的员工在设计数据库时就是把日期设置成了varhcar,结果出现了一堆的问题,都是在日期比较上的,varchar的比较是按照自然比较的,不一定能反映真正的结果。最后只能改数据库。一般存储日期,数据库中使用timestamp类型,java端使用timestamp或者java.util.Date都可以(不要使用java.sql.Date,他只有日期,没有时间)
    如果javabean中直接用 new Date() 或者 new Timestamp(System.currentTimeMillis());对日期进行存储,存到数据库里的确很难看,你可以在存储之前格式化一下。最关键的是,无论你是否格式化,数据库都会正确的识日期,也可以正确的进行日期的比较
    日期比较的时候,把后台传进来的参数直接转换成字符串 处理就行了,sql写成  XXXX where startDate >='2012 23:12:34'就行了,肯定比你用字符串方便多了。
      

  9.   

    "日期比较的时候,把后台传进来的参数直接转换成字符串 处理就行了,sql写成 XXXX where startDate >='2012 23:12:34'就行了,肯定比你用字符串方便多了。"你这还是使用字符串比较呀,我就是这样比较的,失败了我们单位涉及到大量的数据,日期都是使用varchar2来设计的你说出现了一堆问题,比较上的,什么情况会出现什么问题?
      

  10.   

    = =.................. 这个仅仅看上去是比较字符串,但是数据库是按照日期比较的,只要你数据库字段类型是日期行的比如说  
    where  st=1 这代表st这个字段类型是 int型
    where  st='1' 这代表st这个字段类型是 varchar型
    XXXX where startDate >='2012 23:12:34'看上去是在比较字符串,但是因为startDate 是timestamp类型的,它在比较的时候是,是按照时间类型比较的,你总不能写成  XXXX where startDate >=2012 23:12:34 吧,这么写它算是个神马类型?
      

  11.   

    数据库的单引号 '' 只是说明,单引号里面是条件的 值,至于按照什么方式比较,要看字段类型是什么
    where st=1 和 where st='1'  只是为了能够区分开当 值是纯数字的时候,你想比较的到底是数字,还是字符而已