我有一点功能(曾经是一个大功能的一部分,但是我已经将此问题的片段隔开了):
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分。这是怎么回事?
答案 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配置,直到我找到有关此问题的更多信息。