26

JavaJDBCを使用してSQLServer2008に日付を書き込み、それを読み戻しています。
読み戻される日付は、実際に書き込まれた日付よりも一貫して2日前です。

プリペアドステートメントを使用して、日付フィールドを含む行を挿入しています。日付の値は次のように提供されます。

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

DBに日付を書き込んだ後、次のコマンドを実行すると、SQLサーバーに正しい日付が表示されます。

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

JDBCを介して同じクエリを実行する場合は、次を使用して結果セットから日付値を取得します。

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

挿入された行は、テーブル内でnull以外の日付を持つ唯一の行であるため、これは間違ったレコードを読み取った場合ではないように見えます。

これはよく知られている問題だと思いましたが、Googleで「2日間の休暇」の問題を検索して見つけた唯一の参考資料には明確な答えがありませんでした。

何か案は?

beeky(過去に生きている)

4

9 に答える 9

22

障害のあるJDBCドライバー

問題はMSJDBCドライバーであることが判明しました。日付タイプと日付変換の可能なすべての組み合わせを試しましたが、何も機能しませんでした。大量の検索を行った後(最初にそれを行う必要がありました!)、問題がMicrosoftのバージョン3JDBCドライバーであることを示唆する古いSOエントリに関するコメントを見ました。最新のドライバー、バージョン4.somethingを入手しましたが、問題は解決しました。

助けようとしたすべてに感謝します。解決策を投稿するために時間を割いてくれたMikeに特に感謝します。

-=ビーキー

于 2012-07-12T13:11:47.680 に答える
5

Mavenを使用している場合は、Java8にこれを使用してください。

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

ご指摘のとおり、古いバージョンを使用すると、この問題が発生する可能性があり、デバッグが容易ではありません。

于 2017-07-27T15:44:08.810 に答える
2

私は最近この問題に数回遭遇し、フィールドが日付タイプの場合にこれが発生することを思い出す前に髪を引き裂きました。フィールドタイプを日時タイプに切り替えると問題が解決します。

于 2015-05-11T12:41:47.980 に答える
2

user903724が言ったように、修正されるバージョン4に変更しますが、私の場合、sqljdbc4-3.0.jarを使用している場合、この問題は引き続き発生しますが、sqljdbc42.jarに変更すると、この問題は修正されました。私の経験がお役に立てば幸いです。sqljdbc42.jarからダウンロード

于 2016-04-11T15:24:13.233 に答える
2

MSSQL 2015を使用している場合は、このSqljdbc41を使用してこの問題を修正してください

 <!-- https://mvnrepository.com/artifact/com.microsoft.sqlserver/sqljdbc41 -->
<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>sqljdbc41</artifactId>
    <version>6.0.8112</version>
</dependency>
于 2018-10-12T06:09:36.883 に答える
1

この問題は、MicrosoftSQLでdateDataTypeを使用しているときに発生します。これを修正して、日付を日時に変更しました。

于 2018-04-12T12:39:44.600 に答える
0

問題はタイムゾーン値(「GMT」)です。次のように、フェッチメソッド
にこの操作を導入する必要があります。JDBC

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());
于 2012-07-02T15:40:30.937 に答える
0

私はまったく同じ問題を抱えていました。2日間のオフセットは、Java7ランタイム環境の代わりにJava6ランタイム環境を使用するとすぐになくなりました。

したがって、JDBCバージョン4.1とJDBC3ドライバーとの下位互換性の違いでもある可能性があります。

于 2013-08-27T10:06:02.303 に答える
0

Java 8でsqljdbc4を使用しても、まったく同じ問題が発生しました。

アプリケーションでタイプの比較を行うためにこのフィールドが不要になったら、次のようにクエリでフィールドをキャストすることで問題を解決しましたCAST(dbo.tblPwActividadeParticipanteDetalhe.Data AS VARCHAR(10))

于 2017-04-05T06:28:07.280 に答える