> 데이터 베이스 > MySQL 튜토리얼 > PostgreSQL 쿼리에서 겹치는 날짜 범위를 올바르게 찾는 방법은 무엇입니까?

PostgreSQL 쿼리에서 겹치는 날짜 범위를 올바르게 찾는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2025-01-05 00:32:39
원래의
556명이 탐색했습니다.

How to Correctly Find Overlapping Date Ranges in PostgreSQL Queries?

PostgreSQL에서 겹치는 날짜 범위 찾기

문제:

에서 플레이어를 찾는 쿼리 특정 연도의 팀이 잘못된 것 같습니다. 쿼리를 수정하고 누락된 세부정보를 제공하세요.

잘못된 쿼리:

SELECT *
FROM contract
JOIN team USING (name_team)
JOIN player USING(name_player)
WHERE name_team = ?
AND DATE_PART('YEAR',date_join) >= ?
AND DATE_PART('YEAR',date_leave) <= ?
로그인 후 복사

원인:

쿼리가 그렇지 않습니다. BETWEEN 연산자가 잘못 사용되었기 때문에 겹치는 날짜 범위를 찾을 수 없습니다. 적절한 비교를 위해서는 상한을 제외해야 합니다.

정답:

기본 쿼리:

SELECT p.*
FROM team AS t
JOIN contract AS c USING (name_team)
JOIN player AS p USING (name_player)
WHERE t.name_team = ?
AND c.date_join < date '2010-01-01'
AND c.date_leave >= date '2009-01-01';
로그인 후 복사

Distinct 및 NULL을 사용한 세련된 쿼리 처리:

SELECT DISTINCT p.*
FROM contract AS c
JOIN player AS p USING (name_player)
WHERE c.name_team = ?
AND c.date_join < date '2010-01-01'
AND (c.date_leave >= date '2009-01-01' OR c.date_leave IS NULL);
로그인 후 복사

OVERLAPS 연산자 사용:

SELECT DISTINCT name_player
FROM contract
WHERE name_team = ?
AND (date_join, COALESCE(date_leave, CURRENT_DATE)) OVERLAPS
(date '2009-01-01', date '2010-01-01');
로그인 후 복사

범위 유형 및 인덱스 지원 사용:

SELECT DISTINCT name_player
FROM contract
WHERE name_team = ?
AND daterange(date_join, date_leave) &&&
daterange '[2009-01-01,2010-01-01)';
로그인 후 복사

'?'를 바꾸는 것을 잊지 마세요. 쿼리에 필요한 값이 포함된 자리 표시자.

위 내용은 PostgreSQL 쿼리에서 겹치는 날짜 범위를 올바르게 찾는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿