通过jdbc驱动程序查询时,该值不正确。为什么?
我试图通过JDBC驱动程序从GoogleBigQuery查询数据,但有些值似乎不正确 步骤:通过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” 你知道为什么吗 时区是否在本地转换数据 我在一些主机上测试了不同的时区,同样的问题。 在代码实现中
<>我在一些主机上测试了不同的时区,同样的问题。 在代码实现中有一些事情要考虑。正如@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();
}
}