2012-03-23 24 views
6

Tôi đang thực hiện câu lệnh chọn bằng cách sử dụng trình điều khiển cơ sở jdbc (jconn3). Tôi đã kiểm tra câu lệnh bằng thủ công trên isql và tất cả các hàng được trả về một cách chính xác. Tuyên bố được thực hiện trên jdbc:Không có hàng nào được trả lại từ db - nhưng có các hồ sơ được trả lại

select * from mytable where date between ? and ? 

tôi thêm DateFormat như yyyy-MM-dd HH:mm:ss và thiết lập các giá trị thời gian như 0:00:00 cho ngày bắt đầu và ngày kết thúc 23:59:59 cho.

Nó không hoạt động. Số lượng hàng phải là 1000 nhưng đôi khi là 770, đôi khi 990, đôi khi 564 v.v. Không có bất kỳ số lượng hàng cụ thể nào được trả về.

Sau đó, tôi đã thêm thực thi bổ sung chỉ trả về số lượng hàng. Đầu tiên tôi đang thực thi câu lệnh select count(*) from ... sau đó thực hiện select * from .... và bây giờ truy vấn `chọn * từ ... trả về đúng số lượng bản ghi mọi lúc. Điều này không thể liên quan đến bộ nhớ đệm. Và điều kỳ lạ là, tôi đang sử dụng các đối tượng chuẩn bị và kết quả tương tự cho hai thực thi đó.

Bất kỳ ý tưởng nào về vấn đề đó?

@Rulmeq, đây là mã (thêm vào 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()){ 
    ........ 
} 
+1

Hiển thị mã cho chúng tôi. – Goibniu

+0

@Rulmeq, tôi đã thêm mã được đề cập. – Aykut

+1

Bạn có thể bao gồm sự khởi tạo của bạn (định nghĩa) của beginDate và endDate trong mã của bạn không. Họ dường như là chìa khóa ở đây. –

Trả lời

0

Cảm ơn tất cả nhưng vấn đề đã được giải quyết và nó không liên quan đến jdbc. Nó liên quan đến việc sử dụng System.currentTimeMillis() và hệ thống máy chủ lưu trữ quá nhanh. Đó là lý do tại sao hệ thống đôi khi sử dụng cùng một ms. Tôi đã thay đổi các tài liệu tham khảo.

2

Những gì tôi nghĩ vấn đề là mã bạn đang sử dụng để gán giá trị datetime để các đối số truy vấn. Và bây giờ khi bạn đã xác định rằng mã với "select * from ..." đang làm việc tốt, vì vậy tôi nghĩ rằng sự khác biệt duy nhất giữa họ là bạn có thể sử dụng

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(); 

cho "chọn Count (*) từ. . "

+0

@ Shanbaz, đây không phải là giải pháp nhưng bạn phân tích tốt. Cám ơn. – Aykut

0

Trong chức năng Oracle TO_DATE sẽ trợ giúp như bên dưới.

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

Thx nhưng chúng tôi đang sử dụng sybase ase – Aykut

1

Ngày được định nghĩa là ngày, ngày giờ, smalldatetime hoặc dấu thời gian trong myTable? Bạn đang sử dụng setDate và setTimestamp. Một trong số chúng không khớp với loại ngày được định nghĩa trong myTable.

Các vấn đề liên quan