2016-06-03 3 views
0

에 타임 스탬프 비교하여 서로 다른 값을 반환 (큰 하나의 일부로 사용을하지만, 나는이 질문에 대한 세그먼트를 격리 한) :PostgreSQL의 기능은 내가 조금 기능이 온/오프

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 을 반환하지만 호출 할 때 그 모두가 아니다, 그것은 0

를 반환하지만 잠깐 jdbc.queryForObject("SELECT weird_date_issue_function()", Integer.class); 를 사용하여. AND now() - create_date > INTERVAL '1 second'; 부분을 주석 처리하면 응용 프로그램에서도 1을 얻습니다. 여기서 무슨 일이 일어나고있는거야?

+2

'now()'는 ** 트랜잭션 ** 시작시의 시간을 반환합니다. 따라서 자동 커밋을 사용하지 않고 실행하면 "오래 전"일 수 있습니다. 다른 시간 기능 (https://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT) 중 하나를 사용하십시오. 'clock_timestamp()' –

답변

0

일부 검색 및 디버깅 후 시간대가 문제인 것 같습니다.

내 응용 프로그램과 내 IDE 모두에서 select now()과 같은 것은 반환되지만 계산을 시도하자마자 문제가 발생했습니다.

select now() - create_date from user_verifications를 실행, 나는 다음과 같은 두 가지 결과가 (첫 번째는 IDE에서, 올바른 것) 얻을 것이다 : 나는 CEST 시간대에있어 이후

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 

, 이것은 비린내 냄새. 나는이 문제에 대한 자세한 정보를 찾을 때까지 내 스프링 설정에

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

를 추가 할 수 PostgreSQL 9.2 JDBC driver uses client time zone?을 찾은 후, 그것은 충분했다.