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 중국어 웹사이트의 기타 관련 기사를 참조하세요!