【发布时间】:2012-04-07 20:00:24
【问题描述】:
我正在使用 jdbc sybase 驱动程序 (jconn3) 执行 select 语句。我检查了在 isql 上手动执行的语句,并且所有行都正确返回。在 jdbc 上执行的语句:
select * from mytable where date between ? and ?
我将日期格式添加为yyyy-MM-dd HH:mm:ss,并将时间值设置为开始日期的 00:00:00 和结束日期的 23:59:59。
它不工作。行数必须是 1000,但有时是 770,有时是 990,有时是 564 等等。没有任何特定的行数每次都返回。
之后我添加了一个额外的执行,它只返回行数。首先我执行select count(*) from ... 语句,然后执行select * from ....,现在`select * from ...查询每次都返回正确的记录数。这与缓存无关。奇怪的是,我使用相同的preparedstatement 和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()){
........
}
【问题讨论】:
-
@Rulmeq,我添加了有问题的代码。
-
您能否在代码中包含 beginDate 和 endDate 的实例化(定义)。它们似乎是这里的关键。
-
@Aykut:`将时间值设置为开始日期的 00:00:00 和结束日期的 23:59:59。'为什么您不采用相同的时间格式进行初始化?那是为了特定目的吗?因为那一天算多了。
-
感谢@SomnathMuluk。这里不是我写的,但我已经写了。我现在没有时间在这里写整个函数,但会尽快写出来。
-
需要注意的一些事项: 1)您的代码缺少 beginDate 和 EndDate 的初始化。这很重要的原因是因为它可能是错误的根源。 2) 在示例中,您使用 java.sql.Date 和 java.sql.Timestamp 调用准备好的语句。目标 JDBC 数据类型是什么?日期、时间或时间戳? 3)当你转储preparedStatement的输出(一旦它被使用ps.toString()“设置”了)并且你直接在数据库上执行它,你会得到不同的结果集吗?