sql >> Databasteknik >  >> RDS >> Mysql

generera dagar från datumintervall

Den här lösningen använder inga loopar, procedurer eller temporära tabeller . Underfrågan genererar datum för de senaste 10 000 dagarna och kan förlängas till att gå så långt bakåt eller framåt som du vill.

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' 

Utdata:

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

Anmärkningar om prestanda

Testar det här , prestandan är förvånansvärt bra:frågan ovan tar 0,0009 sek.

Om vi ​​utökar underfrågan till att generera ca. 100 000 nummer (och därmed cirka 274 års datum), den körs på 0,0458 sek.

Detta är för övrigt en mycket portabel teknik som fungerar med de flesta databaser med mindre justeringar.

SQL Fiddle-exempel som returnerar 1 000 dagar



  1. Vilken är inställningen för att se tidsdelen med datum i Oracle PL/SQL-utvecklare?

  2. Problem med att anropa lagrad procedur från C# med stor CLOB

  3. Optimizern i Oracle Database 19c

  4. Hur man använder regexp i sqlite