PostgreSQL函数返回不同的值,时间戳比较开/关

时间:2016-06-03 18:59:52

标签: postgresql function date

我有一点功能(曾经是一个大功能的一部分,但是我已经将此问题的片段隔开了):

CREATE OR REPLACE FUNCTION weird_date_issue_function() RETURNS INT AS
$BODY$
DECLARE
  deleted_count INT := 0;
BEGIN
  SELECT count(*)
  INTO deleted_count
  FROM user_verifications
  WHERE verified = FALSE AND now() - create_date > INTERVAL '1 second';
  RETURN deleted_count;
END;
$BODY$
LANGUAGE plpgsql;

user_verification确实包含超过1秒的未经验证的条目(用于测试目的)。

当我从IDE调用select weird_date_issue_function();时,它返回1。 但是当我使用jdbc.queryForObject("SELECT weird_date_issue_function()", Integer.class);调用它时 它返回0。

但等等,这不是全部。如果我注释掉AND now() - create_date > INTERVAL '1 second';部分,我的申请中也会获得1分。这是怎么回事?

1 个答案:

答案 0 :(得分:0)

经过一番搜索和调试,似乎时区就是问题所在。

从我的应用程序和我的IDE中,select now()之类的东西都会返回相同的内容,但是一旦我尝试任何计算,就会出现问题。

通过执行select now() - create_date from user_verifications,我将获得以下两个结果(第一个是来自IDE的正确结果):

0 years 0 mons 0 days 0 hours 48 mins 40.564828 secs
0 years 0 mons 0 days -1 hours -11 mins -23.698618 secs

由于我在CEST时区,这闻到了腥味。找到PostgreSQL 9.2 JDBC driver uses client time zone?后,我就可以添加

<property name="connectionInitSql" value="SET TIME ZONE 'CET'"/>

到我的spring配置,直到我找到有关此问题的更多信息。