Odpowiedź jest niepełna - nie uwzględnia sytuacji, w której jeden klient ma umowę na kilka projektów. Nie uwzględnia też umów już zakończonych i jeszcze nie rozpoczętych. Ja bym to uzupełnił tak:
Kod: Zaznacz cały
SELECT u.*
FROM umowy AS u
INNER JOIN
(
SELECT max('data_rozpoczecia') AS MaxDate, 'id_klient', 'id_projekt'
FROM umowy
WHERE now() BETWEEN 'data_rozpoczecia' AND 'data_zakonczenia'
GROUP BY 'id_klient','id_projekt'
) AS g ON (u.'id_klient'=g.'id_klient')
AND (u.'id_projekt'=g.'id_projekt')
AND (u.'data_rozpoczecia'=g.MaxDate)
a żeby nie było, że tylko z gotowych rozwiązań korzystam, to wcześniej pokombinowałem i wyprodukowałem coś takiego, podejrzewam, że wydajnościowo słabsze, ale też powinno zadziałać (dla wygody pomijam wszystkie 'uszy' w nazwach tabel i kolumn:
Kod: Zaznacz cały
SELECT *
FROM umowy
WHERE now() BETWEEN data_rozpoczecia AND data_zakonczenia
AND id NOT IN
(
SELECT u1.id
FROM umowy u1
JOIN umowy u2 ON u1.id_klient=u2.id_klient
AND u1.id_projekt=u2.id_projekt
AND u1.data_zakonczenia<u2.data_zakonczenia
WHERE now() BETWEEN u1.data_rozpoczecia AND u1.data_zakonczenia
AND now() BETWEEN u2.data_rozpoczecia AND u2.data_zakonczenia
)
Cóż, wymyślenie tego rozwiązania zajęło mi nie więcej niż pół godziny...
[ Dodano: 2009-10-16, 09:19 ]
Jeszcze jedno - nie napisałeś w jakiej bazie danych jesteśmy. Oba powyższe rozwiązania działać powinny w każdej bazie SQLowej. Natomiast w Oracle'u można napisać eleganckie zapytanie zagnieżdżone. Przynajmniej tak mi się wydaje, bo szczerze mówiąc nie chce mi się dokładnie rozpisywać trzeciej już wersji.