2012-07-02 39 views
19

Tôi đang sử dụng Java JDBC để viết ngày đến máy chủ sql 2008 và sau đó đọc lại.
Ngày được đọc thường xuyên hai ngày so với ngày được ghi.ngày liên tục hai ngày tắt

Tôi đang chèn hàng có chứa trường Ngày với câu lệnh đã chuẩn bị. Các giá trị ngày được cung cấp bởi:

java.sql.Date todaysDate = new java.sql.Date(System.currentTimeMillis()) ; 
System.out.println(todaysDate.toString()) -> 2012-07-02 
ps.setDate(8, todaysDate); 

Sau khi viết ngày đến db, sql máy chủ chỉ cho tôi đúng ngày nếu tôi chạy:

select date from table_name where date!=null ->2012-07-02 

Nếu tôi chạy cùng một truy vấn thông qua JDBC sau đó lấy giá trị ngày tháng từ kết quả sử dụng

java.sql.Date sqlDate = rs.getDate("date") ; 
sqlDate.toString() ->2012-06-30 

Hàng được chèn là hàng duy nhất trong bảng có ngày không trống nên có vẻ như đây không phải là trường hợp đọc sai bản ghi.

Tôi nghĩ rằng đây sẽ là một vấn đề nổi tiếng nhưng chỉ tham chiếu tôi có thể tìm thấy bởi tìm kiếm của Google cho một vấn đề "hai ngày nghỉ" không có câu trả lời dứt khoát.

Bất kỳ ý tưởng nào?

beeky (sống trong quá khứ)

+0

Nếu bạn sử dụng PrepareStatement, không chuyển đổi từ hoặc thành Chuỗi. Vượt qua một đối tượng date (hoặc Timestamp) để setDate. –

+0

Các múi giờ của máy chủ và máy khách là gì? –

+0

Bạn có chắc chắn điều này không liên quan đến MM-DD-YYYY và DD-MM-YYYY không? Nếu ngày của bạn sẽ đến và từ chuỗi, chúng có thể được giải thích bởi các thiết lập miền địa phương theo những cách thú vị và bất ngờ (trong thời gian chạy máy khách và trong thư viện cơ sở dữ liệu và trong mã cơ sở dữ liệu). –

Trả lời

16

Lỗi JDBC Driver

Hóa ra vấn đề là trình điều khiển MS jdbc. Tôi đã thử mọi kết hợp có thể có của các loại ngày và chuyển đổi ngày và không có gì hiệu quả. Sau khi rất nhiều tìm kiếm (nên đã làm điều đó đầu tiên!) Tôi thấy một bình luận trên một mục SO cũ hơn hàm ý vấn đề là trình điều khiển jdbc phiên bản 3 của Microsoft. Tôi có trình điều khiển mới nhất, phiên bản 4.cái gì đó và sự cố đã biến mất.

Nhờ tất cả những gì đã cố gắng trợ giúp. Đặc biệt cảm ơn bạn Mike đã dành thời gian để đăng một giải pháp. - = beeky

+0

Thật thú vị, nhưng tôi cũng gặp vấn đề tương tự với Microsft JSBC 4, JTDS hoạt động chính xác – D0dger

0

Vấn đề của bạn là Múi giờ ("GMT").
Bạn cần phải giới thiệu thao tác này trong JDBC phương pháp quyến rũ của bạn như sau:

Calendar gmt = Calendar.getInstance(TimeZone.getTimeZone("GMT")); 
PreparedStatement stmt = connection.prepareStatement(sql); 
stmt.setDate(1, new Date(0)); // I assume this is always GMT 
ResultSet rs = stmt.executeQuery(); 
rs.next(); 

//This will output 0 as expected 
System.out.println(rs.getDate(1, gmt).getTime()); 
+0

TZ sẽ gây ra sự khác biệt trong hai ngày như thế nào? Tôi có thể nhìn thấy một ngày gần đường ngày quốc tế, nhưng hai ngày? –

+0

Mike, ví dụ của bạn là câu trả lời cho câu hỏi của tôi hay một cuộc biểu tình về cách xem chênh lệch múi giờ? – user903724

+0

Bạn đã thử điều này và nó không hoạt động? – GingerHead

0

Tôi đã có chính xác cùng một vấn đề. Sự bù đắp 2 ngày đã biến mất ngay sau khi tôi sử dụng môi trường thời gian chạy java 6 thay vì môi trường chạy thử java 7.

Vì vậy, nó cũng có thể là sự khác biệt giữa khả năng tương thích ngược phiên bản 4.1 của JDBC với trình điều khiển JDBC 3.

1

Tôi đã gặp vấn đề này một vài lần gần đây và xé tóc ra trước khi nhớ rằng nếu trường là loại ngày này xảy ra, việc chuyển loại trường thành loại datetime sẽ giải quyết được vấn đề.

0

giống như những gì user903724 nói, thay đổi lên phiên bản 4 sẽ được cố định, nhưng trong trường hợp của tôi, Khi tôi đang sử dụng sqljdbc4-3.0.jar, vấn đề này vẫn tái tạo, nhưng tôi thay đổi nó để sqljdbc42.jar, vấn đề này đã cố định. Hy vọng trải nghiệm của tôi sẽ hữu ích. tải xuống từ sqljdbc42.jar

0

Tôi đã có cùng một vấn đề chính xác ngay cả khi sử dụng sqljdbc4 với Java 8.

Khi tôi không cần trường này để thực hiện bất kỳ loại so sánh nào trong ứng dụng, tôi đã giải quyết vấn đề bằng cách truyền trường trong truy vấn của tôi như sau: CAST(dbo.tblPwActividadeParticipanteDetalhe.Data AS VARCHAR(10)).

2

Đối với những người đang sử dụng maven, sử dụng này cho java 8:

<dependency> 
    <groupId>com.microsoft.sqlserver</groupId> 
    <artifactId>mssql-jdbc</artifactId> 
    <version>6.2.1.jre8</version> 
</dependency> 

Vì nó được chỉ ra, nếu bạn sử dụng một phiên bản cũ, bạn có thể phải đối mặt với vấn đề này, và nó không phải là dễ dàng để debug .

+0

Như một điểm nhỏ của thực tế (số phiên bản trình điều khiển) tăng cường câu trả lời từ trước, có vẻ như điều này đã được đăng là bình luận hoặc một bản chỉnh sửa cho Câu trả lời khác. –