当前位置: 首页 > 面试题库 >

SQL Server的timestamp2应该如何在JDBC中工作?

郎和通
2023-03-14
问题内容

我在尝试使用timestamp2代替SQL Server
2008中的Timestamp时遇到了一些麻烦。显然,rs.getTimestamp在timestamp和timestamp2之间的行为非常不同。但是,我找不到任何文档说明应该有所不同,或者我应该使用其他有所不同的文档。我想知道我是否做错了什么。

环境:

  • 在SQL Express 2008(10.0)和SQL Server 2008 R2(10.5)上都进行了尝试。
  • sqljdbc4.jar版本3.0,大小为537,303字节,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
    }

我唯一的选择切换回时间戳了吗?

编辑:对于将来的Google员工,使用sqljdbc4.jar 3.0版,该测试在Linux上失败,但在Windows上通过。我尚未尝试使用SQL
Server 2012附带的sqljdbc4.jar版本4.0。


问题答案:

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



 类似资料:
  • 问题内容: 我正在使用 shouldChangeCharactersInRange 作为使用即时类型搜索的方式。 但是我有一个问题,在文本字段实际更新之前 应该 调用 shouldChangeCharactersInRange : 在目标C中,我使用以下方法解决了这个问题: 但是,我尝试用Swift编写此代码: 在获得值之前,该方法仍会被调用? 问题答案: 雨燕4,雨燕5 此方法不使用 注意。使用

  • 在底部将此选项设置为true vs false时,它们将列出结果的差异 在我的EMR配置(在presto-config中)中包含设置为之后,我仍然会根据这个测试查询获得新的结果(并且我的UTC时间戳仍然会自动转换)。 对于启用遗留时间戳行为还需要做些什么有什么建议吗?

  • 官方的SQLServer数据库的JDBC驱动程序 驱动类名:com.microsoft.sqlserver.jdbc.SQLServerDriver URL格式:jdbc:sqlserver://[serverName[\instanceName][:portNumber]][;property=value[;property=value]]

  • 问题内容: 输出如下: 我原以为takes2Second函数会在takes5Second开始之前完全完成。那是应该如何工作的。请告诉我。最后的功能永远不会运行。谢谢。 问题答案: 不完全的。您正在立即执行这些功能(对数组求值后立即执行),这就是它们似乎同时启动的原因。 传递给要执行的每个函数的回调在异步库内部。您可以在函数完成后执行它,并传递错误和/或值来执行它。您无需自己定义该功能。 最终函数永

  • 我正在尝试在SqlServer和Oracle上进行批量插入,并在以下测试代码中实现: } 该代码将数据插入到具有主键ID和时间戳的Tester表中。 我想做的是以这样一种方式插入数据库:即使批处理中的一些数据已经存在,也会插入不存在的数据,因为违反了主键约束,所以会抛出BatchUpdateException。 我正在测试一个有50000个条目的批次,其中50%已经在数据库中。 使用SqlServ

  • 由于某些原因,我的sql server数据库无法连接到我的intellij java应用程序。这是我第一次这么做,所以我不明白我做错了什么。 我用来连接数据库的代码是。 我得到的错误是。