我正在使用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()){
........
}
答案 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。我改变了参考文献。