我在尝试使用timestamp2代替SQL Server 2008中的Timestamp时遇到了一些麻烦。显然,rs.getTimestamp在timestamp和timestamp2之间的行为非常不同。但是,我找不到任何文档说明应该有所不同,或者我应该使用其他有所不同的文档。我想知道我是否做错了什么。
环境:
这是一个演示该问题的单元测试。唯一的“魔术”是“ Db.getConnection()”,您可以用适当的代码替换它。datetime和datetime2的测试相同,但datetime2测试失败,且日期早于2天。我将数据库中的所有时间都视为GMT / UTC,并且没有尝试将时区信息添加到datetime2数据的数据库数据中。
private void testTimestamp(TimeZone gmtTz, Connection conn, String query, Calendar expectedCal) throws SQLException { PreparedStatement stmt = conn.prepareStatement(query); ResultSet rs = stmt.executeQuery(); while (rs.next()) { // Note the expectedCal has a GMT timezone. Date actualTs = rs.getTimestamp("dt", expectedCal); // Just print out the time difference long diff = actualTs.getTime() - expectedCal.getTimeInMillis(); System.out.println("Diff=" + diff); // Do the test to make sure they are the same // In practice, this succeeds for datetime and fails for datetime2 Assert.assertEquals(expectedCal.getTimeInMillis(), actualTs.getTime()); } } @Test public void testDateTime() throws SQLException { Connection conn = Db.getConnection(); TimeZone gmtTz = TimeZone.getTimeZone("GMT"); String query; Calendar expectedCal = Calendar.getInstance(gmtTz); expectedCal.clear(); expectedCal.set(2011, 10, 02, 11, 17); query = "select CAST('2011-11-02 11:17:00' as datetime) as dt"; testTimestamp(gmtTz, conn, query, expectedCal); query = "select CAST('2011-11-02 11:17:00.0000000' as datetime2) as dt"; testTimestamp(gmtTz, conn, query, expectedCal); // results in an error }
我唯一的选择切换回时间戳了吗?
编辑:对于将来的Google员工,使用sqljdbc4.jar 3.0版,该测试在Linux上失败,但在Windows上通过。我尚未尝试使用SQL Server 2012附带的sqljdbc4.jar版本4.0。
我记得没有听到有关官方SQL Server驱动程序和JTDS被首选的好消息(尽管我似乎找不到该链接)。我个人会使用JTDS(当然要经过严格的测试),或者再回到不会引起问题的版本。我没有使用过SQL Server,但从外观上看,这似乎datetime2是首选的数据类型,因此我宁愿不还原。选项(d)并不是IMO的好选择。:)
datetime2