我使用Java JDBC写的日期到SQL Server 2008,然后读出来。
所读回的日期始终比实际写入的日期早两天。
我将含有一份声明日期字段行。 该日期值由提供
java.sql.Date todaysDate = new java.sql.Date(System.currentTimeMillis()) ;
System.out.println(todaysDate.toString()) // -> 2012-07-02
ps.setDate(8, todaysDate);
写日期到数据库后,SQL Server显示我正确的日期,如果我运行:
select date from table_name where date!=null // ->2012-07-02
如果我运行通过JDBC相同的查询,然后使用检索结果集的日期值
java.sql.Date sqlDate = rs.getDate("date") ;
sqlDate.toString() // ->2012-06-30
插入的行与非空日期表的唯一行,以便这不会似乎读取错误的记录的情况下。
我认为这将是一个众所周知的问题,但唯一的参考,我可以通过谷歌搜索的“休息两天”的问题找到没有明确的答案。
有任何想法吗?
beeky(生活在过去)
故障JDBC驱动程序
原来,问题是MS JDBC驱动程序。 我试图日期类型和日期的转换并没有什么的每一个可能的组合工作。 搜索大量(应该那样做第一!)之后,我看到一个评论的旧SO项是隐含的问题是微软的版本3 JDBC驱动程序。 我得到了最新的驱动程序,版本4.something和问题走了。
感谢所有那些试图帮助。 特别感谢您迈克采取张贴解决方案的时间。
- = beeky
对于那些谁使用Maven,使用的Java 8:
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>6.2.1.jre8</version>
</dependency>
正如有人指出,如果你使用的是旧版本,你可能会面对这个问题,这是不容易调试。
如果使用的是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>
我几次最近碰到这个问题,撕毁我的头发,记住的是,如果该字段类型日期的出现这种情况,切换字段类型键入日期时间解决了这个问题之前。
像什么user903724说,更改为4,将是固定的,但对我来说版本,当我使用sqljdbc4-3.0.jar,这个问题仍然再现,但我改变它sqljdbc42.jar,这个问题得到了解决。 希望我的经验将是有益的。 从下载sqljdbc42.jar
这个问题是当我们使用日期数据类型在Microsoft SQL到来。 我已经解决了这个改变日期的日期时间。
你的问题是时区值(“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());
我有完全相同的问题。 通过2天的偏移,一旦走了,我用java 6运行时环境,而不是Java 7的运行环境。
因此,它是可能也与JDBC 3驱动程序的JDBC 4.1版本的向后兼容性之间的差异。
我即使使用sqljdbc4与Java 8完全相同的问题。
一旦我不需要这个领域做任何类型的应用比较我铸造领域在我这样的查询解决该问题: CAST(dbo.tblPwActividadeParticipanteDetalhe.Data AS VARCHAR(10))