Tôi đã gặp sự cố tương tự vào ngày khác mà thành phần thời gian bị cắt bớt từ một số ngày.
Chúng tôi đã thu hẹp nó xuống sự khác biệt trong các phiên bản Trình điều khiển Oracle.
On FAQ Oracle có một phần về vấn đề này:
select sysdate from dual; ...while(rs.next())
Trước 9201, đây sẽ trở lại: getObject cho sysdate: java.sql.Timestamp < < < < getDate cho sysdate : java.sql.Date getTimetamp cho sysdate: java.sql.Timestamp
Từ 9201 trở đi sau đây sẽ được thử lại urned
getObject cho sysdate: java.sql.Date < < < < < getDate cho sysdate: java.sql.Date >> không thay đổi getTimetamp cho sysdate: java.sql.Timestamp >> không thay đổi
Lưu ý: java.sql.Date không có phần thời gian trong khi java.sql.Timestamp làm.
Với thay đổi này trong ánh xạ Datatype, một số ứng dụng sẽ không thành công và/hoặc tạo kết quả không chính xác khi trình điều khiển JDBC được nâng cấp từ trình điều khiển JBDC 8i/9iR1 lên 920x. Để duy trì tính tương thích và giữ cho các ứng dụng hoạt động sau khi nâng cấp, cờ tương thích đã được cung cấp. Nhà phát triển hiện có một số tùy chọn:
- Sử dụng oracle.jdbc.V8Tương thích tương thích.
Trình điều khiển JDBC không phát hiện phiên bản cơ sở dữ liệu theo mặc định. Để thay đổi lá cờ tương thích để xử lý kiểu dữ liệu dấu thời gian, sở hữu kết nối
'oracle.jdbc.V8Compatible'
có thể được thiết lập để 'true' và người lái xe cư xử như nó cư xử trong 8I, 901x, 9 200 (với đối với TIMESTAMP).
Theo mặc định, cờ được đặt thành 'sai'. Trong phương thức khởi tạo OracleConnection, trình điều khiển có được phiên bản máy chủ và đặt cờ tương thích một cách thích hợp.
java.util.Properties prop=newjava.util.Properties();
prop.put("oracle.jdbc.V8Compatible","true");
prop.put("user","scott");
prop.put("password","tiger");
String url="jdbc:oracle:thin:@host:port:sid";
Connection conn = DriverManager.getConnection(url,prop);
Với JDBC 10.1.0.x, thay vì tài sản kết nối, tài sản hệ thống sau đây có thể được sử dụng: java -Doracle.jdbc.V8Compatible = true ..... Lưu ý: Cờ này là một khách hàng chỉ cờ điều chỉnh Dấu thời gian và ánh xạ ngày. Nó không ảnh hưởng đến bất kỳ tính năng Cơ sở dữ liệu nào.
'2. Sử dụng set/getDate và set/getTimestamp khi xử lý kiểu dữ liệu cột Date và TimeStamp cho phù hợp.
Máy chủ 9i hỗ trợ cả kiểu cột Ngày và Dấu thời gian DATE được ánh xạ tới java.sql.Date và TIMESTAMP được ánh xạ tới java.sql.Timestamp.
Vì vậy, cho hoàn cảnh của tôi, tôi đã có mã như thế này:
import java.util.Date;
Date d = rs.getDate(1);
Với 9i Tôi đã nhận được một java.sql.Timestamp (mà là một lớp con của java.util.Date) để tất cả mọi thứ đã được groovy và tôi đã có giờ và phút của tôi.
Nhưng với 10g, cùng một mã bây giờ nhận được một java.sql.Date (cũng là một lớp con của java.util.Date để nó vẫn biên dịch) nhưng HH: MM bị TRUNCATED !!.
Giải pháp thứ hai khá dễ dàng đối với tôi - chỉ cần thay thế getDate bằng getTimestamp và bạn sẽ không sao. Tôi đoán đó là một thói quen xấu.
từ khóa ** chuyển đổi **, đó là lý do tại sao tôi nhận được +2 giờ – n002213f
Tôi bị nhầm lẫn, nếu chuyển đổi hoạt động bình thường, không nên nhìn thấy ngày ít hơn 2 giờ, thay vì ? – wds
@wds - kiểm tra chỉnh sửa và phản hồi của tôi – n002213f