【问题标题】:No row returned from db - but there are records to be returned没有从 db 返回行 - 但有要返回的记录
【发布时间】: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()“设置”了)并且你直接在数据库上执行它,你会得到不同的结果集吗?

标签: java sql jdbc sybase


【解决方案1】:

我认为问题在于您用于将日期时间值分配给查询参数的代码。现在,正如您指定带有“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 "select Count(*) from .."

【讨论】:

  • @Shanbaz,这不是解决方案,但您分析得很好。谢谢。
【解决方案2】:

在 Oracle TO_DATE 函数中会有所帮助,如下所示。

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

【讨论】:

  • 谢谢,但我们使用的是 sybase ase
【解决方案3】:

在 myTable 中,日期是否定义为日期、日期时间、小日期时间或时间戳?您正在使用 setDate 和 setTimestamp。其中之一与 myTable 中定义的日期类型不匹配。

【讨论】:

    【解决方案4】:

    感谢大家,但问题已解决,与 jdbc 无关。它与使用 System.currentTimeMillis() 和主机系统太快有关。这就是为什么系统有时使用相同的毫秒。我更改了参考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-05
      • 2018-07-12
      • 1970-01-01
      • 2018-08-23
      • 2012-01-02
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多