sql >> Databáze >  >> RDS >> Mysql

generovat dny z období

Toto řešení nepoužívá žádné smyčky, procedury ani dočasné tabulky . Dílčí dotaz generuje data za posledních 10 000 dní a lze jej prodloužit tak, aby šel zpět nebo dopředu, jak si přejete.

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' 

Výstup:

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

Poznámky k výkonu

Vyzkoušejte to zde , výkon je překvapivě dobrý:výše uvedený dotaz trvá 0,0009 s.

Pokud poddotaz rozšíříme tak, aby vygeneroval cca. 100 000 čísel (a tedy data v hodnotě přibližně 274 let), běží za 0,0458 s.

Mimochodem, toto je velmi přenosná technika, která funguje s většinou databází s drobnými úpravami.

Příklad SQL Fiddle s návratem 1 000 dní



  1. Manipulace s připojením a omezení s ProxySQL

  2. Získání dynamicky generované kontingenční tabulky do dočasné tabulky

  3. Jak zahrnout celkový počet vrácených řádků do sady výsledků z příkazu SELECT T-SQL?

  4. Zkontrolujte zdroj ovládání všech ovládacích prvků ve vašem projektu MS Access