sql >> Database >  >> RDS >> Mysql

dagen genereren uit datumbereik

Deze oplossing gebruikt geen lussen, procedures of tijdelijke tabellen . De subquery genereert datums van de afgelopen 10.000 dagen en kan worden uitgebreid om zo ver terug of vooruit te gaan als u wilt.

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' 

Uitvoer:

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

Opmerkingen over prestaties

Test het hier , de prestatie is verrassend goed:de bovenstaande zoekopdracht duurt 0,0009 sec.

Als we de subquery uitbreiden om ca. 100.000 nummers (en dus ongeveer 274 jaar aan datums), het loopt in 0,0458 sec.

Dit is overigens een zeer draagbare techniek die met kleine aanpassingen met de meeste databases werkt.

SQL Fiddle-voorbeeld wordt 1000 dagen geretourneerd



  1. De EXECUTE-toestemming is geweigerd voor het object 'xxxxxxx', database 'zzzzzzz', schema 'dbo'

  2. Zet de primaire sleutel neer met behulp van een script in de SQL Server-database

  3. Long converteren naar Varchar2

  4. Wat zijn de BIN$...-tabellen in de ALL_TAB_COLUMNS-tabel van Oracle?