Skocz do zawartości

Mysql - Zagwozdka Z Zapytaniem


qmic

Rekomendowane odpowiedzi

Załóżmy że mam tabelę z dwoma polami START_DATE, END_DATE i podaję zakres dat w zapytaniu, chcę aby zapytanie mi zwróciło wszystkie rekordy których zakres się pokrywa w jakiejkolwiek części pomiędzy tymi datami.

Graficznie wygląda to tak

       START                END
----xxx|x-----------------|--------
--------|------------------x|xxxxx---------
xxxxxx|xxxxxxxxxxxxx|xxxxxxxxxx

 

EDIT.Wklejcie to gdzieś gdzie jest czcionka o stałej szerokości aby było lepiej widać

 

Ma ktoś pomysł jak to zrobić?

 

Odnośnik do komentarza
Udostępnij na innych stronach

Witam.

Pola w tabeli to START_DATE, i END_DATA (oczywiści pola te dla każdego rekordu różne od NULL) zakres to DATA_OD i DATA_DO i też obydwa różne od NULL.

SELECT * FORM TABELA TAB WHERE TAB.START_DATA <= DATE 'DATA_DO' AND TAB.END_DATA >= DATE 'DATA_OD'

 

jest to na żywca zapytanie z firebirda ale po przeróbce może być ogólne w MySql funkcja DATE ma składnie DATE('2009....')

Odnośnik do komentarza
Udostępnij na innych stronach

SELECT *

FROM TAB

WHERE (START_DATE BETWEEN @data_od AND @data_do)

OR (END_DATE BETWEEN @data_od AND @data_do)

 

To w jakimś ogólnym języku sqlowym, w mysql'u nigdy nie pisałem

 

nie wiem czy celowo, ale rysunki nie uwzględniają 4 przypadku (a może źle je zrozumiałwm)

 

-----|--xxxx--|-----

 

to trzeba by dodać OR (START_DATE <= @data_od AND END DATE >= @data_do)

 

Oczywiście można to napisać też inaczej.

Odnośnik do komentarza
Udostępnij na innych stronach

Dzieki wszystkim, chodziło mi właśnie o between, wszystko pięknie działa jako ciekawostkę powiem że czas wykonywania poprzedniego zapytania bez between zajmowało 2s, natomiast z użyciem between 0,27s.

Czyli chyba jest wydajniejsze od standardowych mechanizmów porównań

 

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...