标准中使用NOW()的查询在psql与JDBC

时间:2018-02-02 14:22:05

标签: java postgresql jdbc psql

我正在通过控制台在psql中执行以下查询并获取输出:

select details
  from history_transactions
      ,history_operations
  where history_operations.transaction_id = history_transactions.id
    and type = 3
    and created_at >= NOW() - INTERVAL '5 minutes'

然而,当我从我的java程序中调用此代码时,它不会返回任何输出。 ResultSetnull。 PFB我的代码:

Connection conn = getConnection();
java.sql.Statement stmt = null;
String sql ="select details from  history_transactions , history_operations where  history_operations.transaction_id=history_transactions.id and type =3  and  created_at >= NOW() - INTERVAL '5 minutes'";
try{
    stmt = conn.createStatement();
    rs = stmt.executeQuery(sql);
    while(rs.next()) {
        System.out.println("Inside resultset");
    }
}
catch(Exception e)
{
    e.printStackTrace();
}

知道我哪里错了吗?

我也没有任何例外。

注意:如果我将间隔时间从5分钟更改为6小时或更长时间,那么它正在工作并给我输出。如果我改变间隔< 5小时后,结果集为空。但是,如果我登录到psql服务器并执行查询,因为它在代码中。我正在获得输出。

我正在使用java版本" 1.8.0_151"和PostgreSQL JDBC 4.2驱动程序,42.2.1 - 根据https://jdbc.postgresql.org/download.html - 它是合适的驱动程序。

1 个答案:

答案 0 :(得分:0)

PostgreSQL NOW()函数返回timestamp with time zone值。为了对timestamp类型的列使用该值(没有时区),PostgreSQL需要隐式地CAST该值以匹配列类型。但是,测试表明,如果客户端和服务器设置为不同的时区,那么当通过psql连接时,与通过JDBC连接时,CAST的结果可能会有所不同。例如:

服务器时区:UTC
客户所在的时区:America / Denver,a.k.a。" MST / MDT",目前UTC-7

通过psql连接时,

SELECT CAST(CAST(NOW() AS timestamp) AS varchar)

返回UTC值

2018-02-05 22:40:25.012933

但是当通过JDBC连接时,相同的查询返回MST值

2018-02-05 15:40:57.288587

要在JDBC下返回UTC值,我们可以执行

set time zone 'UTC'

在运行SELECT查询之前。