Arjuna Aircraft Ident.: F-MBSD | Imaginez :
Mon patron à un problème : il veut récupérer toutes les dates comprises entre une date et une autre.
Moyen simple que j'ai trouvé :
Créer une table "compteur" contenant :
valeur
1
2
3
4
5
...
100
(on peut aller plus loin que 100 mais là ça suffit)
Puis faire :
Code :
- select :datdeb + (valeur - 1) jour
- from compteur
- where :datdeb + (valeur - 1) between :datdeb and :datfin
|
Bon, ça marche sans problème.
Seulement, c'est pas super propre.
Est-ce qu'on peut trouver un autre moyen ?
Evidement, on peut se passer de cette table compteur et utiliser rownum sur une table contenant assez de lignes, m'enfin c'est pas mieu (et encore moins lisible )
Via une fonction récursive (mais j'ai pas la synaxe en tête, voici la syntaxe SQL Server)
Code :
- create function getJours(@datdeb as datetime, @datfin as datetime, @curindex as integer)
- returns table
- as
- begin
- if datediff(d, @datfin, @datdeb) < @curindex
- begin
- return (
- select dateadd(d, @datdeb, @curindex)
- union
- select * from getJours(@datdeb, @datfin, @curindex + 1)
- )
- end
- else
- begin
- return (select dateadd(d, @datdeb, @curindex))
- end
- end
- go
- select *
- from getJours(@datdeb, @datfin, 0)
- go
|
(grossomodo, à priori, ça marche pas, mais c'est presque ça )
sauf que... bah on est limité en niveau de récursivité à 20 ou 30 occurences avec SQL Server, et Oracle a une limite assez proche, donc ça peut pas marcher dans tous les cas... |