2010-05-18 42 views
17

Tôi đang sử dụng PreparedStatement với Timestamp trong mệnh đề where:PreparedStatement và setTimestamp trong oracle jdbc

PreparedStatement s=c.prepareStatement("select value,utctimestamp from t where utctimestamp>=? and utctimestamp<?"); 
s.setTimestamp(1, new Timestamp(1273017600000L)); //2010-05-05 00:00 GMT 
s.setTimestamp(2, new Timestamp(1273104000000L)); //2010-05-06 00:00 GMT 
ResultSet rs = s.executeQuery(); 
if(rs.next()) System.out.println(rs.getInt("value")); 

Kết quả tôi nhận được là khác nhau, khi tôi có múi giờ khác nhau trên máy tính của khách hàng. Đây có phải là lỗi trong Oracle jdbc không? hoặc hành vi chính xác?

Phiên bản cơ sở dữ liệu Oracle là 10.2 và tôi đã thử với oracle jdbc phiên bản trình điều khiển mỏng 10.2 và 11.1.

Tham số là Dấu thời gian và tôi dự kiến ​​sẽ không có chuyển đổi thời gian nào được thực hiện trên đường. Kiểu cột cơ sở dữ liệu là DATE, nhưng tôi cũng đã kiểm tra nó với kiểu cột TIMESTAMP có cùng kết quả.

Có cách nào để đạt được kết quả chính xác không? Tôi không thể thay đổi múi giờ mặc định trong toàn bộ ứng dụng thành UTC.

Nhờ sự giúp đỡ của bạn

+0

Vui lòng chỉnh sửa câu hỏi của bạn và thêm các loại t_begin và t_end. –

Trả lời

22

Để đặt một giá trị dấu thời gian trong một PreparedStatement trong múi giờ UTC ta nên sử dụng

stmt.setTimestamp(1, t, Calendar.getInstance(TimeZone.getTimeZone("UTC"))) 

Giá trị Timestamp luôn là UTC, nhưng không phải lúc nào người lái xe jdbc có thể tự động gửi nó chính xác đến máy chủ. Tham số thứ ba, Lịch, giúp trình điều khiển chuẩn bị chính xác giá trị cho máy chủ.

+3

Trên thực tế, nó là: setTimestamp (int parameterIndex, Dấu thời gian x, Lịch cal) – rhu

+1

Trong môi trường của tôi thiết lập một đối tượng lịch với múi giờ khác nhau có ảnh hưởng đến dữ liệu SQL được viết. – Robert

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