Java JDBC:日期一直休息两天错误的 JDBC 驱动程序

2022-09-01 17:28:31

我正在使用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);

将日期写入数据库后,如果我运行,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

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

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

有什么想法吗?

beeky(生活在过去)


答案 1

错误的 JDBC 驱动程序

事实证明,问题出在MS JDBC驱动程序上。我尝试了日期类型和日期转换的所有可能组合,但没有任何效果。经过大量的搜索(应该先这样做!我看到一个关于较旧的SO条目的评论,暗示问题是微软的版本3 JDBC驱动程序。我得到了最新的驱动程序,版本4.something,问题消失了。

感谢所有试图帮助的人。特别感谢迈克花时间发布解决方案。

-=比克


答案 2

对于那些使用maven的人,在java 8中使用这个:

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

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