约会一天两天

use*_*724 24 java sql-server date jdbc

我正在使用Java JDBC将日期写入sql server 2008,然后将其读回.
读取的日期始终比书面日期提前两天.

我正在使用预准备语句插入包含Date字段的行.日期值由以下人员提供:

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

将日期写入db后,如果运行,sql server会显示正确的日期:

select date from table_name where date!=null // ->2012-07-02
Run Code Online (Sandbox Code Playgroud)

如果我通过JDBC运行相同的查询,则使用从结果集中检索日期值

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

插入的行是表中唯一具有非空日期的行,因此这似乎不是读取错误记录的情况.

我认为这将是一个众所周知的问题,但我可以通过谷歌搜索找到"两天休息"问题的唯一参考没有明确的答案.

有任何想法吗?

beeky(生活在过去)

use*_*724 21

JDBC驱动程序错误

事实证明问题是MS jdbc驱动程序.我尝试了日期类型和日期转换的所有可能组合,但没有任何效果.经过大量的搜索(应该先完成!)我看到一个较旧的SO条目的评论暗示问题是来自Microsoft的版本3 jdbc驱动程序.我得到了最新的驱动程序,版本4.something,问题消失了.

感谢所有试图提供帮助的人.特别感谢Mike花时间发布解决方案. - = beeky


Has*_*son 5

对于那些使用 maven 的人,将它用于 java 8:

 <dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>6.2.1.jre8</version>
 </dependency>
Run Code Online (Sandbox Code Playgroud)

如前所述,如果您使用旧版本,则可能会遇到此问题,并且不容易调试。