
Générer des dates dans plusieurs plages de dates
Lorsque l'exigence s'étend au-delà d'une seule plage de dates, générer toutes les dates dans plusieurs plages de dates présente un défi . Cet article aborde de tels scénarios et propose une solution efficace.
Le problème
Comme illustré dans le SQL Fiddle fourni, la tâche consiste à générer toutes les dates pour un ensemble donné. de plusieurs plages de dates, comme suit :
1 | <br>ID START_DATE END_DATE<br>101 1er avril 2013 10 avril 2013<br>102 10 mai 2013 12 mai 2013<br>
|
La solution
La requête suivante répond à ce problème problème :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | select
A.ID,
A.START_DATE+delta dt
from
t_dates A,
(
select level-1 as delta
from dual
connect by level-1 <= (
select max(end_date - start_date) from t_dates
)
)
where A.START_DATE+delta <= A.end_date
order by 1, 2
|
Copier après la connexion
Décomposition de la solution
- La sous-requête crée une structure hiérarchique (en utilisant CONNECT BY) pour générer une séquence de nombres jusqu'au durée maximale des plages de dates.
- La requête principale joint cette séquence aux plages de dates d'entrée, en ajoutant les numéros de séquence au début dates pour générer toutes les dates possibles.
- La clause WHERE garantit que seules les dates valides dans chaque plage sont générées.
- La clause ORDER BY trie la sortie par ID puis par date.
Exemple de sortie
Pour l'entrée fournie, la requête renvoie ce qui suit sortie :
1 | <br>Dates d'identification<br>101 avril 01 2013<br>101 avril 02 2013<br>101 avril 03 2013<br>101 avril 04 2013<br>101 avril, 05 2013<br>101 avril 06 2013<br>101 avril 07 2013<br>101 avril 08 2013<br>101 avril 09 2013<br>101 avril 10 2013<br>102 mai 10 2013<br>102 mai 11 2013<br>102 mai 12 2013<br>
|
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!