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

时间:2019-12-17 08:32:25

标签: jdbc google-bigquery timestamp timezone

我尝试通过JDBC驱动程序从Google BigQuery查询数据,但是某些值似乎不正确。

步骤:

  1. https://storage.googleapis.com/simba-bq-release/jdbc/SimbaJDBCDriverforGoogleBigQuery42_1.2.2.1004.zip

  2. 免费下载适用于googlebigquery的Simba JDBC驱动程序
  3. 将驱动程序加载到Java应用程序

  4. 通过jdbc连接Google查询 示例代码如下:

   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();
        }
    }

您会发现结果不是“ 0001-01-01 00:00:00.000000”,而是“ 0001-01-03 08:00:00.000000”。

你知道为什么吗?

时区在本地转换数据?

我在具有不同时区,相同问题的某些主机中对其进行了测试。

1 个答案:

答案 0 :(得分:0)

在代码实现中需要考虑一些事项。正如@MarkRotteveel所提到的,由于发生了多个历史性更改,因此使用0001-01-01进行测试将导致混乱。

BigQuery和大多数最常用的软件系统都可以与tz database配合使用,this thread旨在记录历史时区,并且您会发现与UTC有时会有所不同。作为测试,您可以尝试在BigQuery中查询时间戳“ 0001-01-01 America / Los Angeles”,并且会得到奇怪的结果“ 0001-01-01 07:52:58 UTC”。 this thread中有进一步的解释。

关于代码的实现,您还应考虑查看docs以便正确提取时间戳,因为在ResultSet上使用getString方法的方式似乎可能导致错误。