2011-12-06 3 views
0

테이블에 bigint로 저장된 날짜가 있으며 30 일보다 오래된 레코드를 선택하려고합니다. 나는이 질문과 관련하여 SO와 Google에 관한 수많은 질문을 보았지만 필요한 것이 무엇인지 찾아 내지 못했습니다. 매우 비효율적 인 것 같다 내가 가지고있는 Heres는 무엇bigint datetimes를 사용하여 X 일보다 오래된 레코드를 선택하십시오.

: 내가 이해에서

SELECT 
    COUNT(*) 
FROM 
    alert 
WHERE 
    ('1969-12-31 19:00:00 GMT'::timestamp + (alert.mytstamp::text)::interval) < (localtimestamp - INTERVAL '30 days') 

는, 그것은 30 "일 전"타임 스탬프와 비교하기 위해 타임 스탬프에 BIGINT mytstamp 필드로 변환됩니다. 그것은 테이블의 모든 레코드에 대해 이렇게합니다. (현재 시간 스탬프를 30 일로 변환 한 다음 bigint로 변환하는 것이 더 효율적입니다.)

SQL 기술이 약하지만, 그래서 쉽게 간다 :). 도와 주셔서 감사합니다.

답변

1

다시 한 번 나는 SO에 게시 한 직후 해결책을 찾았습니다. 그것이 행운을 빌어 요 내가 생각하는 그 매력. 어쨌든, 이것은 내가 무엇을 찾고 있어요 것 같다, 그리고 훨씬 더 효율적입니다 : 내가 포스트 그레스 한 번 extract('epoch' from (CURRENT_TIMESTAMP - INTERVAL '10 days'))::bigint에 대한 계산을 수행 궁금하거나,하지만 모든 레코드의 비교에있어

SELECT 
    COUNT(*) 
FROM 
    alert 
WHERE 
    alert.timestamp < extract('epoch' from (CURRENT_TIMESTAMP - INTERVAL '10 days'))::bigint 

.

+1

CURRENT_TIMESTAMP와 계산 모두 결정적입니다. PostgreSQL은 한번 계산해야합니다. (CURRENT_TIMESTAMP는 현재 트랜잭션이 시작될 때 서버의 시간입니다.) [기타 시간 함수] (http://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT) 다르게 행동하십시오. –

관련 문제