Orcale : Récupérer toutes jours entre deux dates

Orcale : Récupérer toutes jours entre deux dates - SQL/NoSQL - Programmation

Marsh Posté le 07-12-2005 à 14:25:39    

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 :
  1. select :datdeb + (valeur - 1) jour
  2. from compteur
  3. 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 :D)
 
Via une fonction récursive (mais j'ai pas la synaxe en tête, voici la syntaxe SQL Server)
 

Code :
  1. create function getJours(@datdeb as datetime, @datfin as datetime, @curindex as integer)
  2. returns table
  3. as
  4. begin
  5.    if datediff(d, @datfin, @datdeb) < @curindex
  6.    begin
  7.       return (
  8.       select dateadd(d, @datdeb, @curindex)
  9.       union
  10.       select * from getJours(@datdeb, @datfin, @curindex + 1)
  11.       )
  12.    end
  13.    else
  14.    begin
  15.       return (select dateadd(d, @datdeb, @curindex))
  16.    end
  17. end
  18. go
  19. select *
  20. from getJours(@datdeb, @datfin, 0)
  21. go


 
(grossomodo, à priori, ça marche pas, mais c'est presque ça :D)
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...

Reply

Marsh Posté le 07-12-2005 à 14:25:39   

Reply

Marsh Posté le 07-12-2005 à 15:23:07    

je sais bien que c'est l'heure de la digestion mais bon :o

Reply

Marsh Posté le 07-12-2005 à 15:24:12    

En effet, le plus simple est d'utiliser rownum dans une grosse table :
 

Code :
  1. SELECT TO_DATE(date_de_debut)+rownum-1
  2. FROM all_objects
  3. WHERE rownum <= TO_DATE(date_de_fin) - TO_DATE(date_de_debut) + 1;

Reply

Marsh Posté le 07-12-2005 à 15:46:50    

hmmmmm. je crois je vais me cantonner à utiliser la table "compteur".
 
ou alors à la limite une fonction qui tape dans "all_objects"
 
mais sinon... ça me semble un peu gore de mettre "all_objects" dans une requête alors que c'est pour récupérer une liste de jours :D je suis pas sûr que le gars qui va faire la maintenance derrière comprenne quoi que ce soit ;)

Reply

Marsh Posté le 07-12-2005 à 16:08:46    

Ajoute un commentaire :D
 
(au fait, t'es toujours si fâché avec Oracle que tu ne sais même pas écrire ces 6 lettres dans le bon ordre ? :lol: )

Reply

Marsh Posté le 07-12-2005 à 17:23:57    

ben... on peut dire comme ça...
 
pas réussi à faire une fonction qui retourne une table... il sait vraiment pas faire ou quoi ?
 
seul truc que j'ai trouvé, c'est retourner une collection d'un datatype utilisateur, mais ça ne marche pas chez moi... c'est bizance !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed