没有从db返回的行 - 但是有返回的记录

时间:2012-03-23 08:42:12

标签: java sql jdbc sybase

我正在使用jdbc sybase驱动程序(jconn3)执行select语句。我在isql上手动执行了检查语句,所有行都正确返回。在jdbc上执行的语句:

select * from mytable where date between ? and ?

我将dateformat添加为yyyy-MM-dd HH:mm:ss,并将时间值设置为开始日期的00:00:00和结束日期的23:59:59。

它不起作用。行数必须为1000,但有时为770,有时为990,有时为564等。每次返回时都没有任何特定的行数。

之后我添加了一个额外的执行,它只返回行数。首先,我执行select count(*) from ...语句然后执行select * from ....现在`select * from ... query每次返回正确的记录数。这与缓存无关。奇怪的是,我正在为这两次执行使用相同的preparestatement和resultset对象。

关于这个问题的任何想法?

@Rulmeq,这是代码(2012-03-29添加)

ResultSet rs = null;
PreparedStatement ps = null;

ps = myConn.getConnection().prepareStatement("select count(*) from myTable where date between ? and ?");
ps.setDate(1, new java.sql.Date(beginDate.getTime()));   // format : yyyy-MM-dd
ps.setDate(2, new java.sql.Date(endDate.getTime()));    // format : yyyy-MM-dd
rs = ps.executeQuery();
rs.next();
// some logs here

ps = myConn.getConnection().prepareStatement("select * from myTable where date between ? and ?");
ps.setTimestamp(1, new java.sql.Timestamp(beginDate.getTime()));    // format : yyyy-MM-dd hh:mm:ss  
ps.setTimestamp(2, new java.sql.Timestamp(endDate.getTime()));  // format : yyyy-MM-dd hh:mm:ss  
rs = ps.executeQuery();
while(rs.next()){
    ........
}

4 个答案:

答案 0 :(得分:2)

我认为问题是您用于将日期时间值分配给查询参数的代码。现在,当您使用" select * from ..."指定代码时工作正常,所以我认为它们之间的唯一区别是你可以使用

ps = myConn.getConnection().prepareStatement("select Count(*) from myTable where date between ? and ?");
ps.setTimestamp(1, new java.sql.Timestamp(beginDate.getTime()));
ps.setTimestamp(2, new java.sql.Timestamp(endDate.getTime()));  
rs = ps.executeQuery();

for"从.."

中选择Count(*)

答案 1 :(得分:1)

日期是否定义为myTable中的date,datetime,smalldatetime或timestamp?您正在使用setDate和setTimestamp。其中一个与myTable中定义的日期类型不匹配。

答案 2 :(得分:0)

在Oracle TO_DATE函数中,如下所示。

 "select count(*) from myTable where date between TO_DATE(?, 'yyyy-mm-dd') and TO_DATE(?, 'yyyy-mm-dd')"

答案 3 :(得分:-1)

感谢所有人,但问题已经解决,而且与jdbc无关。它与使用System.currentTimeMillis()和主机系统太快有关。这就是为什么系统有时会使用相同的ms。我改变了参考文献。