Comment effectuer une itération sur une plage de dates dans PL/SQL
J'ai besoin d'écrire un rapport qui fournit un résumé des totaux sur une table avec des plages de dates pour chaque enregistrement.
table data:
option start_date end_date
opt1 6/12/2009 6/19/2009
opt1 6/3/2009 6/13/2009
opt2 6/5/2009 6/6/2009
Ce que je veux sortir est essentiellement ceci:
date option count
6/1/2009 opt1 0
6/1/2009 opt2 0
6/2/2009 opt1 0
6/2/2009 opt2 0
6/3/2009 opt1 0
6/3/2009 opt2 1
Je vais avoir un moment difficile de déterminer comment itérer sur une plage de dates. Je suis sûr que c'est un simple curseur qui pourrait être créé pour cela, mais je suis à une perte. De préférence en PL/SQL
Mise à JOUR:
J'ai fini à l'aide de l'exemple ici pour accomplir ce que je voulais faire. Cela crée une fonction qui génère un tableau de dates.
Vous devez vous connecter pour publier un commentaire.
Vous aurez besoin d'une sorte de calendrier de la boucle à travers une gamme de date. J'ai construit à l'aide de la se connecter par niveau truc. Vous pouvez ensuite rejoindre le calendrier avec vos données (jointure croisée puisque vous voulez une suite, même quand il n'y a pas d'option pour cette journée):
Une solution que j'utilise, c'est de convertir la date en un nombre entier de gamme que vous pouvez utiliser dans une boucle for, puis de le convertir à une date à faire des choses avec elle. Vous ne pouvez pas faire toutes les jointures ou quoi que ce soit de cette façon, mais c'est beaucoup plus petite solution que celles déjà posté le:
Comme un complément à d'autres techniques, d'une façon que je itérer sur les dates est la suivante:
Ici est une réponse basée sur une réponse ci-dessus:
Il utilise un début et date de fin:
Il répertorie tous les jours de 07/01/2013 à 07/31/2013. Facilement adaptable à n'importe quel intervalle de date.
Ce type de requête est mieux traitée si vous avez un deuxième "utilitaire" de la table, que vous pouvez utiliser pour à peu près n'importe quelle requête où vous avez besoin de convertir des plages dans des seaux. L'utilité de la table n'est rien de plus qu'une liste de nombres:
SI nous supposons que vous souhaitez afficher les 30 jours, par exemple
L'idée est que vous créez un produit Cartésien entre votre itérateur table et votre table avec la plage, puis de filtrer tous les cas où votre gamme de conditions ne sont pas remplies. Vous pouvez l'utiliser dans de nombreux endroits, et est l'un des meilleurs exemples pourquoi il est préférable de modéliser vos données avec des plages d'opposition à intervalles discrets - parce que vous pouvez toujours convertir facilement à intervalles discrets à l'aide de cette technique.
edit: j'ai vraiment ne devriez pas utiliser ENTRE pour la plage de dates des requêtes - je l'ai changé pour >= <