phoenix時間差8小時

過程:

準備數據

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參數的形式

 

發佈了21 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章