Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SQL Server';时间戳2应该在JDBC中工作吗?_Java_Sql Server 2008_Datetime2_Sqljdbc - Fatal编程技术网

Java SQL Server';时间戳2应该在JDBC中工作吗?

Java SQL Server';时间戳2应该在JDBC中工作吗?,java,sql-server-2008,datetime2,sqljdbc,Java,Sql Server 2008,Datetime2,Sqljdbc,在SQLServer2008中,尝试使用Timestamp 2而不是Timestamp时遇到一些问题。显然,rs.getTimestamp在timestamp和timestamp 2之间具有非常不同的行为。然而,我找不到任何文档说明应该有所不同,或者我应该使用不同的东西。我不知道我是否只是做错了什么 环境: 已在SQL Express 2008(10.0)和SQL Server 2008 R2(10.5)上试用 sqljdbc4.jar版本3.0,大小为537303字节,CRC-32=a0aa

在SQLServer2008中,尝试使用Timestamp 2而不是Timestamp时遇到一些问题。显然,rs.getTimestamp在timestamp和timestamp 2之间具有非常不同的行为。然而,我找不到任何文档说明应该有所不同,或者我应该使用不同的东西。我不知道我是否只是做错了什么

环境:

  • 已在SQL Express 2008(10.0)和SQL Server 2008 R2(10.5)上试用
  • sqljdbc4.jar版本3.0,大小为537303字节,CRC-32=a0aa1e25,MD5=402130141d5f2cee727f4371e2e8fd8a
  • Java 1.6
下面是一个单元测试,演示了这个问题。唯一的“魔力”是“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
    }
我唯一的选择是切换回时间戳吗

编辑:对于未来的谷歌用户,使用sqljdbc4.jar版本3.0,测试在Linux上失败,但在Windows上通过。
我还没有尝试过SQL Server 2012附带的sqljdbc4.jar 4.0版。

我记得没有听到过关于官方SQL Server驱动程序和JTD被首选的好消息(尽管我似乎找不到这个链接)。我个人会选择JTDS(当然是经过严格测试的),或者回到不会引起问题的版本。我没有使用过SQL Server,但从的外观来看,
datetime2
似乎是首选的数据类型,因此我不想返回。选项(d)在我看来并不是一个好的选项:)

我记得没有听到关于官方SQL Server驱动程序和JTD被优先使用的好消息(尽管我似乎找不到这个链接)。我个人会选择JTDS(当然是经过严格测试的),或者回到不会引起问题的版本。我没有使用过SQL Server,但从的外观来看,
datetime2
似乎是首选的数据类型,因此我不想返回。选项(d)在我看来并不是一个好选项:)

如果您正在使用Sun JRE 1.7和Microsoft JDBC 3.0驱动程序,请参阅本文

如果您觉得在我们的驱动程序中发现了错误,可以通过Microsoft Connect进行报告。

如果您将Sun JRE 1.7与Microsoft JDBC 3.0驱动程序一起使用,请参阅本文

如果您觉得在我们的驱动程序中发现了错误,可以通过Microsoft Connect进行报告。

如果出现故障,这两个值有多大不同?这种差异是否始终保持不变?此外,您能否在每次测试后重置
expectedCal
?另外,如果您没有传递“GMT”日历,而是传递默认的
日历
实例,那么它是否有效?谢谢您的想法。datetime2始终比预期时间早2天(48小时)。创建具有相同值的新日历具有完全相同的差异。使用默认日历也有完全相同的区别。到目前为止,无论我如何划分它都是一个问题。好的,这缩小了问题的范围。如果可以的话,还有两件事:1)如果删除附加精度(即.000000第2部分),它是否仍然给出不正确的值?是否可以使用其他驱动程序进行尝试?删除精度没有任何区别<代码>JTDS(我以前没听说过,谢谢你的参考)通过
sqljdbc4.jar(2.0版)可以正常工作。但是
sqljdbc4.jar
(3.0版)不起作用。现在的选择可能是a。使用JTD;B使用sqljdbc4.jar版本2.0;C将数据库字段从datetime2转换为datetime。或者d。将错误报告给Microsoft,等待他们解决问题。评论讨论时间过长,因此我已将回复移至新帖子。如果失败,这两个值有多大区别?这种差异是否始终保持不变?此外,您能否在每次测试后重置
expectedCal
?另外,如果您没有传递“GMT”日历,而是传递默认的
日历
实例,那么它是否有效?谢谢您的想法。datetime2始终比预期时间早2天(48小时)。创建具有相同值的新日历具有完全相同的差异。使用默认日历也有完全相同的区别。到目前为止,无论我如何划分它都是一个问题。好的,这缩小了问题的范围。如果可以的话,还有两件事:1)如果删除附加精度(即.000000第2部分),它是否仍然给出不正确的值?是否可以使用其他驱动程序进行尝试?删除精度没有任何区别<代码>JTDS
(我以前没听说过,谢谢你的参考)通过
sqljdbc4.jar(2.0版)可以正常工作。但是
sqljdbc4.jar
(3.0版)不起作用。现在的选择可能是a。使用JTD;B使用sqljdbc4.jar版本2.0;C将数据库字段从datetime2转换为datetime。或者d。将错误报告给Microsoft,等待他们解决问题。评论讨论时间有点太长,因此我已将我的回复移至一篇新帖子。感谢您全程的投入,Sanjay。你真的帮我弄明白了选择是什么,太棒了。我不能百分之百确定我会选择哪一个。正如你所说,JTD需要严格的测试。短期内,我可能会回到sqljdbc4.jar版本2,或者将字段转换回datetime,并仔细研究JTDS的长期解决方案。使用sqljdbc4.jar版本3.0,测试在Linux(我的生产环境)上失败,但在Windows上通过。我不认为这会改变我的选择,但这些信息可能对将来发现这一点的人有用。所以微软并不是完全疯了。谢谢你全程的投入,桑杰。你真的帮我弄明白了选择是什么,太棒了。我不是100%的苏