Tôi biết rằng một java.sql.Date nên có giờ, phút, giây và mili giây được đặt thành 0, để tuân thủ định nghĩa của ngày SQL chuẩn. Đây là tài liệu here (giống nhau trong Java 8).java.sql.Date trong Java 8 so với Java 6
Tôi cũng biết rằng Oracle DATE typecó các trường thời gian này của YEAR, MONTH, DAY, HOUR, MINUTE và SECOND. Nhưng không có phân đoạn thứ hai hay múi giờ.
tôi nhận thấy rằng cùng một truy vấn trong Java 6 và trong Java 8 không cư xử như nhau:
private static final String REQUETE_LISTE_CALENDRIER_DATE =
" SELECT ID_DATE, JOUR" +
" FROM CALENDRIER " +
" WHERE ID_DATE = ? ";
Ràng buộc với PreparedStatement
một java.sql.Date "dateCourante" được định nghĩa như thế này (mà lập một giá trị cho các lĩnh vực này thời gian):
GregorianCalendar gregorianCalendar = new GregorianCalendar(); // "now"
java.sql.Date dateCourante = new java.sql.Date(gregorianCalendar.getTime().getTime()); // date AND time of "now"
- với Java 6, tôi tìm thấy một giá trị,
- với Java 8, tôi thì không.
Trong cơ sở dữ liệu của tôi, ngày có giờ, phút, giây đến 0. Chúng ta có thể kiểm tra với truy vấn sau đây:
select to_char(id_date, 'DD/MM/YYYY HH24:MI:SS')
from calendrier
where id_date = to_date('26/08/2016', 'DD/MM/YYYY');
cung cấp cho:
26/08/2016 00:00:00
Vì vậy, những gì tôi hiểu, đó là:
- trong Java 6, các trường thời gian của
java.sql.Date
được đặt thành 0 trước khi truy vấn được khởi chạy trên cơ sở dữ liệu, trong khi - trong Java 8, các trường thời gian của
java.sql.Date
được để lại như trong truy vấn.
Tôi chưa thể tìm thấy tài liệu về hành vi này.
Ai đó có thể xác nhận hoặc giải thích điều đó không?
Cách giải quyết khác, tôi sử dụng điều này, như được giải thích here: dDate = java.sql.Date.valueOf (dDate.toLocalDate()); // trong đó dDate là java.sql.Date
Điều này tùy thuộc vào trình điều khiển Oracle JDBC ** ** - không phải phiên bản Java theo như tôi biết. Các trình điều khiển mới hơn không tuân thủ các thông số kỹ thuật của JDBC (vì Oracle không quan tâm đến các đặc tả riêng của nó): https://community.oracle.com/message/13398818#13398818 –
Việc triển khai 'java.sql.Date' không cắt ngắn giá trị mili giây cung cấp (và iirc nó không bao giờ có); văn bản trong javadoc là một hướng dẫn cho các nhà phát triển trình điều khiển cách họ phải xử lý nó. Vì vậy, có khả năng vấn đề là làm thế nào trình điều khiển Oracle xử lý nó. –
Ở trên thực sự được ghi chú trong liên kết được tham chiếu trong câu hỏi: "Nếu giá trị mili giây đã cho chứa thông tin thời gian, ** trình điều khiển sẽ đặt ** thành phần thời gian thành [...] tương ứng với số không GMT". – mustaccio