generate_series () equivalente in MySQL

Devo fare una query e unirmi a tutti i giorni dell’anno, ma nel mio db non c’è una tabella di calendario.
Dopo google-ing ho trovato generate_series() in PostgreSQL. MySQL ha qualcosa di simile?

La mia tabella attuale ha qualcosa del tipo:

 date qty 1-1-11 3 1-1-11 4 4-1-11 2 6-1-11 5 

Ma la mia domanda deve tornare:

 1-1-11 7 2-1-11 0 3-1-11 0 4-1-11 2 and so on .. 

    Questo è come lo faccio. Crea una serie di date dal 2011-01-01 al 2011-12-31 :

     select date_format( adddate('2011-1-1', @num:[email protected]+1), '%Y-%m-%d' ) date from any_table, (select @num:=-1) num limit 365 -- use limit 366 for leap years if you're putting this in production 

    L’unico requisito è che il numero di righe in any_table sia maggiore o uguale alla dimensione dell’intervallo necessario (> = 365 righe in questo esempio). Molto probabilmente lo utilizzerai come sottoquery dell’intera query, quindi nel tuo caso any_table può essere una delle tabelle che usi in quella query.

    Versione migliorata della soluzione di @Karolis che garantisce che funzioni per qualsiasi anno (compresi gli anni bisestili):

     seleziona la data da (
         selezionare
             formato data(
             adddate ('2011-1-1', @num: = @ num + 1),
             '% Y-% m-% d'
         ) Data
         a partire dal
             qualsiasi_tabella,
         (selezionare @num: = - 1) num
         limite
             366
     ) come dt
     dove anno (data) = 2011
    

    Stavo pensando a questa soluzione, ma senza la data “hardcoded”, e mi è venuto in mente questo valido per l’anno in corso (aiutato da queste risposte ). Si prega di notare il

     where year(date)=2011 

    non è necessario in quanto la selezione già filtra la data. Anche in questo modo, non importa quale tabella (almeno come affermato prima che la tabella abbia almeno 366 righe) è stata utilizzata, poiché la data viene “calcasting” in runtime.

      select date from ( select date_format( adddate(MAKEDATE(year(now()),1), @num:[email protected]+1), '%Y-%m-%d' ) date from your_table, (select @num:=-1) num limit 366 ) as dt