過程:
準備數據
UPSERT INTO COM_MART.TEST_TABLE (ID,TIME_TEST) VALUES('1116',CURRENT_TIME());
結果顯示的時間比服務器當前時間少了整整8個小時,原因是phoenix默認是0時區,並無法設置時區(也可以理解爲不會或沒有找到設置的方法)
1116 | 2019-11-27 06:48:50.551
程序執行
無條件查詢
String sql = "select * from COM_MART.TEST_TABLE";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
Timestamp time = rs.getTimestamp("TIME_TEST");
String time_str = rs.getString("TIME_TEST");
System.out.println("timestamp類型:" + time);
System.out.println("String類型:" + time_str);
}
使用timestamp接收會自動根據服務器時區轉換爲正常時間,使用string類型接收的結果,不會根據服務器時區轉換;
帶上時間條件查詢
String sql = "select * from COM_MART.TEST_TABLE WHERE TIME_TEST BETWEEN ? AND ? ";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setTimestamp(1, Timestamp.valueOf("2019-11-27 06:00:00"));
ps.setTimestamp(2, Timestamp.valueOf("2019-11-27 07:00:00"));
ResultSet rs = ps.executeQuery();
while (rs.next()) {
System.out.println("6點到7點查詢出來數據");
}
String sql1 = "select * from COM_MART.TEST_TABLE WHERE TIME_TEST BETWEEN ? AND ? ";
PreparedStatement ps1 = conn.prepareStatement(sql1);
ps1.setTimestamp(1, Timestamp.valueOf("2019-11-27 14:00:00"));
ps1.setTimestamp(2, Timestamp.valueOf("2019-11-27 15:00:00"));
ResultSet rs1 = ps1.executeQuery();
while (rs1.next()) {
System.out.println("14點到15點查詢出來數據");
}
使用預編譯,timestamp參數,能在正常時區的時間段檢索到結果;
插入
String sql = "upsert into COM_MART.TEST_TABLE values ('1',TO_TIMESTAMP('2019-11-27 18:00:00'))";
PreparedStatement ps = conn.prepareStatement(sql);
ps.execute();
String sql1 = "upsert into COM_MART.TEST_TABLE values ('2',?)";
PreparedStatement ps1 = conn.prepareStatement(sql1);
ps1.setTimestamp(1, Timestamp.valueOf("2019-11-27 18:00:00"));
ps1.execute();
conn.commit();
conn.close();
再次查詢的結果是:
總結
phoenix時區默認是0時區,使用程序進行操作的時候,需要統一方式:
要麼使用string接收結果,查詢條件和新增使用拼接sql的形式
或使用timestamp接收結果,查詢條件和新增適用於編譯,設置timestamp參數的形式