通过jdbc驱动程序查询时,该值不正确。为什么?

通过jdbc驱动程序查询时,该值不正确。为什么?,jdbc,google-bigquery,timestamp,timezone,Jdbc,Google Bigquery,Timestamp,Timezone,我试图通过JDBC驱动程序从GoogleBigQuery查询数据,但有些值似乎不正确 步骤: 从以下站点免费下载用于googlebigquery的Simba JDBC驱动程序 将驱动程序加载到Java应用程序 通过jdbc连接google查询 示例代码如下所示: 您可以发现结果不是“0001-01-01 00:00:00.000000”,而是“0001-01-03 08:00:00.000000” 你知道为什么吗 时区是否在本地转换数据 我在一些主机上测试了不同的时区,同样的问题。 在代码实现中

我试图通过JDBC驱动程序从GoogleBigQuery查询数据,但有些值似乎不正确

步骤:

  • 从以下站点免费下载用于googlebigquery的Simba JDBC驱动程序

  • 将驱动程序加载到Java应用程序

  • 通过jdbc连接google查询 示例代码如下所示:

  • 您可以发现结果不是“0001-01-01 00:00:00.000000”,而是“0001-01-03 08:00:00.000000”

    你知道为什么吗

    时区是否在本地转换数据


    <>我在一些主机上测试了不同的时区,同样的问题。

    在代码实现中有一些事情要考虑。正如@MarkRotteveel所提到的,使用0001-01-01进行测试将导致混淆,因为存在多个历史性变化

    BigQuery和大多数最常用的软件系统都使用它,它旨在记录历史时区,与UTC相比,您会发现偶尔的差异。作为测试,您可以尝试在BigQuery中查询时间戳“0001-01-01 America/Los Angeles”,并将得到奇数结果“0001-01-01 07:52:58 UTC”。这本书还有进一步的解释

    关于您的代码实现,您还应该考虑查看,以便正确地提取时间戳,因为在结果集上使用GETSoupe方法的方式可能会导致错误。



    我也用Datadirect驱动程序测试它,它也有同样的问题。所以,我想,也许这是设计,但根本原因是什么?如果使用equal filter查询时区列的值,则不正确。在Google Bigquery UI中的另一个测试中,它可以正常工作。i、 例如,语句结果是正确的(“0001-01-01 00:00:00 UTC”)如果不使用0001-01-01的日期进行测试,您将遇到围绕历史日历更改等的各种奇怪情况,并且可能会遇到
    getString(..)
    does(
    getTimestamp(..).toString()
    ),考虑到
    java.sql.Timestamp
    的需求和实现,它可能会有其他问题。谢谢Mark。当我使用时间戳ts=rs.getTimestamp(1)时;要检查值的详细信息,它似乎也不正确。i、 e,该值为0001-01-03 08:00:00.0。也许,正如你所说,这是一个历史性的问题。谢谢。@MarkRotteveel您能否将您的评论作为答案发布,以便社区从中受益?您还可以附加此链接作为时区历史变化的示例:
       public static void main(String[] args) {
    
            Connection conn = null;
            String url ="jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" +
                      "ProjectId=fedjdbc;OAuthType=0;DefaultDataset=jdbc;" +
                      "OAuthServiceAcctEmail=safed-913@fedjdbc.iam.gserviceaccount.com;" +
                        "OAuthPvtKeyPath=/Users/laptop/workspace/bigquery/accounts/fedjdbc-5cb29b8a02fb.json";
    
            try {
                Class.forName("com.simba.googlebigquery.jdbc42.Driver");
                conn = DriverManager.getConnection(url);
    
                query(conn);
                conn.close();
    
    
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    
        public static void query(Connection conn) {
            String sql = "select * from numbers1";
            sql = "select * from numbers1";
            sql = "select timestamp(\"0001-01-01 00:00:00 UTC\") from jdbc.test_date";
            try {
                PreparedStatement stmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
                System.out.println("query begin");
                java.util.Date date = new java.util.Date();
    
                System.out.println(System.currentTimeMillis());
    
                ResultSet rs = stmt.executeQuery();
                System.out.println(System.currentTimeMillis());
                System.out.println("query end");
    
                while (rs.next()) {
                    System.out.println(rs.getString(1));
                    //System.out.println(rs.getTimestamp(1));
                }
                rs.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }