Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Tage aus dem Datumsbereich generieren

Diese Lösung verwendet keine Schleifen, Prozeduren oder temporären Tabellen . Die Unterabfrage generiert Daten für die letzten 10.000 Tage und kann erweitert werden, um so weit zurück oder vorwärts zu gehen, wie Sie möchten.

select a.Date 
from (
    select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a) + (1000 * d.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
    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 d
) a
where a.Date between '2010-01-20' and '2010-01-24' 

Ausgabe:

Date
----------
2010-01-24
2010-01-23
2010-01-22
2010-01-21
2010-01-20

Hinweise zur Leistung

Testen Sie es hier , die Leistung ist überraschend gut:Die obige Abfrage dauert 0,0009 Sek.

Wenn wir die Unterabfrage erweitern, um ca. 100.000 Zahlen (und damit Daten im Wert von etwa 274 Jahren) läuft es in 0,0458 Sekunden.

Übrigens ist dies eine sehr portable Technik, die mit geringfügigen Anpassungen mit den meisten Datenbanken funktioniert.

SQL-Fiddle-Beispiel, das 1.000 Tage zurückgibt