Só voltando um pouco
Código: Selecionar todos
select * from
(select adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) gen_date from
(select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
(select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
(select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
(select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
(select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
where gen_date between '2017-01-01' and '2017-12-31'
Isso é até exagerado, mas muito interessante.
são 5 tabelas de 0 a 9.
Está sendo feito o JOIN, o que vai gerar a combinação de 99999 registros.
A fórmula é o que vai transformar isso em números de 0 a 99999, e somar à data de 1/1/1970, gerando uma sequência de 9.999 datas.
Traduzindo em Harbour:
Código: Selecionar todos
FOR nDigito1 = 0 TO 9
FOR nDigito2 = 0 TO 9
FOR nDigito3 = 0 TO 9
FOR nDigito4 = 0 TO 9
FOR nDigito5 = 0 TO 9
? Stod( "19700101" ) + ;
( nDigito1 * 10000 ) + ;
( nDigito2 * 1000 ) + ;
( nDigito3 * 100 ) + ;
( nDigito4 * 10 ) + ;
nDigito5
NEXT
NEXT
NEXT
NEXT
NEXT
Pois é... acabou fazendo FOR/NEXT do "jeito tabela".
Fez operação com tabelas, que resultaram numa tabela com 9.999 datas, e selecionou as datas que interessavam.
NÃO SEI se compensaria fazer cada tabela de 1 em 1, 10 em 10, 100 em 100, e transformar a fórmula em apenas soma.
Se fizer diferença, talvez milésimos de segundo.
Mas é muito interessante.
É o que já conhecemos, mas fazendo com o recurso que está disponível no SQL, que é operação com tabelas.
E nem dá pra dizer que é coisa nova: aprendemos na escola sobre operações assim, só não lembro qual era o nome, lembro vagamente sobre união, intersecção, e coisas do tipo.