Jeśli chcesz otrzymać listę dni, a SQL jak
wybrać ...w dniach, w których date
jest pomiędzy '2010-01-20 2010-01-24' i ''
i powrotnego danych, takie jak:
days
----------
2010-01-20
2010-01-21
2010-01-22
2010-01-23
2010-01-24
Rozwiązanie to nie wykorzystuje pętle, procedury lub tabele Temp. Podzapytanie generuje daty z ostatnich tysiąc dni i może zostać przedłużone tak, aby przejść tak daleko w tył lub do przodu, jak chcesz.
select a.Date
from (
select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date
from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
) a
where a.Date between '2010-01-20' and '2010-01-24'
wyjściowa:
Date
----------
2010-01-24
2010-01-23
2010-01-22
2010-01-21
2010-01-20
Uwagi dotyczące wydajności
Testowanie go here, wydajność jest zaskakująco dobre: powyższe zapytanie trwa 0,0009 sek.
Jeśli rozszerzymy podzapytanie, aby wygenerować około. 100 000 liczb (a więc około 274 lat dat), trwa to 0,0458 sek.
Nawiasem mówiąc, jest to bardzo przenośna technika, która działa z większością baz danych z drobnymi korektami.
Nie jest jasne, o co pytasz. Jaki masz problem? Czy pytasz, czy możesz wysłać zapytanie do wszystkich tabel we wszystkich bazach danych, czy pytasz, czy możesz zapytać o tabelę o nazwie "system"? Drugi przykład powinien działać dobrze. Pierwszy przykład nie będzie działał tak, jak myślisz, są to dwa fragmenty tekstu, a nie daty. Będziesz musiał przechowywać daty we właściwym formacie. – Tom
Sądzę, że mają na myśli proste zapytania, aby w dowolnym momencie uzyskać listy dat lub liczb między podanymi zakresami. – MartW
@ Tom: Zakładam, że pyta o 'generate_series'. – Quassnoi