Struktura tabeli
id_hours (INT PK)
id_application (INT FK)
time (FLOAT) ( chodzi po prostu o liczbę godzin )
week (INT) ( numer tygodnia )
year (INT)
start_date (DATE)
end_date (DATE)
Nie są to wszystkie pola tabeli, ale tylko te istotne w tej kwestii.
Teraz próbuję utworzyć zapytanie, które zrealizuje następujące założenia :
- Pobierz wszystkie godziny (time) dla aplikacji (id_application) z przedziału tygodni 1 do 4 (week) roku 2010 (year)
- Może istnieć aplikacja, która posiada godziny na przełomie roku 2009 i 2010 ( czyli część godzin ma na rok 2009 a część na 2010)
Tak więc robię to w następujący sposób.
Krok pierwszy :
Pobieram z tabeli minimalną datę startu (start_date) oraz maksymalną datę końca (end_date) dla przedziału tygodni 1 do 4 (week) oraz roku 2010 (year)
Dzięki temu wiem, czy jakaś aplikacja nie masz jeszcze godzin w roku 2009.
Zapytanie
SELECT date(MIN(julianday(start_date))), date(MAX(julianday(end_date))) FROM hours_application
WHERE
year = 2010
AND
week BETWEEN 1 AND 4
AND
end_date <= '$control_date'
Zmienna $control_date to data YYYY-MM-DD ostatniego dnia 4 tygodnia, żeby nie wybiegał za bardzo w przyszłość z wynikami.
(Specyficzny sposób pobierania dat związany jest z używaniem SQLite).
Krok drugi :
Mając już datę początkową ($max_start) oraz końcową ($max_end) pobieram listę godzin (time)
Zapytanie
SELECT H.time
FROM
hours_application
WHERE
julianday(start_date) >= julianday($max_start)
AND
julianday(end_date) <= julianday($max_end)
Jednak nie udaje mi się osiągnąć zamierzonego celu.
Problem polega na tym, iż mam kontrolę nad tym, żeby zapytanie nie pobierało aplikacji powyżej daty końca ($max_end), ale nie kontroluje już tego by nie pobierał godzin dla aplikacji nie mających kontynuacji w roku 2010 - pobiera również te godziny, które są przypisane tylko do roku 2009 - a nie powinien.
Trochę już nad tym siedzę i już tylko kłębią mi się w głowie same błędne rozwiązania.
I teraz prośba do Was o wsparcie, sugestie i uwagi.
Z góry wielkie dzięki za wszelkie uwagi.
Pozdrawiam.