Нет строки, возвращенной из БД - но есть записи, которые должны быть возвращены - PullRequest
7 голосов
/ 23 марта 2012

Я выполняю оператор select с использованием драйвера jdbc sybase (jconn3).Я проверил оператор с выполненным вручную на 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 ... возвращает правильное количество записей каждый раз.Это не может быть связано с кэшированием.И странно то, что я использую одни и те же подготовленные объекты и наборы результатов для этих двух процессов.

Есть идеи по этому вопросу?

@ 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 ]

2 голосов
/ 30 марта 2012

Я думаю, что проблема в коде, который вы используете для присвоения значений даты и времени аргументам запроса. И теперь, когда вы указали, что код с «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();

для "выберите количество (*) из .."

1 голос
/ 03 апреля 2012

Определяется ли в myTable дата как date, datetime, smalldatetime или timestamp?Вы используете setDate и setTimestamp.Один из них не соответствует типу даты, указанному в myTable.

0 голосов
/ 06 апреля 2012

Спасибо за все, но проблема была решена, и она не была связана с jdbc. Это было связано с использованием System.currentTimeMillis (), а хост-система работает слишком быстро. Вот почему система иногда использует ту же мс. Я изменил ссылки.

0 голосов
/ 02 апреля 2012

В Oracle функция TO_DATE поможет, как показано ниже.

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