Je souhaite récupérer les données des 4 derniers trimestres, y compris le trimestre en cours.
Supposons que si j'exécute la requête le 30-MAR-2019
, alors je veux des données du 01-APR-2018
au 31-MAR-2019
et si j'exécute la requête le 01-avr-2019
alors je veux des données entre le 01-JUL-2018
et le 30-JUN-2019
< / p>
Pourriez-vous s'il vous plaît m'aider sur le même sujet
4 Réponses :
Vous pouvez faire:
select (trunc(sysdate, 'Q') + interval '3' month) as next_quarter_start, (trunc(sysdate, 'Q') + interval '15' month) - interval '1' day as next_quarter_end from dual;
pourriez-vous me faire plaisir pour supprimer également les erreurs de syntaxe? la requête ci-dessus n'est pas en cours d'exécution.
@OnkarTiwari. . . Il n'y a pas d'erreur de syntaxe. Cela a été testé avant de le publier, et voici la preuve: dbfiddle.uk/… a>.
@GordonLinoff - en fait, il y avait une erreur dans le code affiché ici. J'ai corrigé intervalle '1 jour'
en intervalle '1' jour
. De rien ;-)
ne pas obtenir le résultat souhaité. Je dois aller chercher la première date du premier trimestre et la dernière date du 4e trimestre. Si j'exécute la requête aujourd'hui donc le dernier jour du trimestre en cours est le 30-JUN-2019 et la première date du 3 trimestre précédent est le 01-JUL-2018 ...... nous devons sélectionner les données du 4 trimestre, y compris le trimestre en cours
@OnkarTiwari. . . Modifiez simplement la date de fin en ajoutant des mois supplémentaires.
cela fonctionnera:
select TRUNC(sysdate+1, 'Q') - interval '9' month,TRUNC(sysdate+1, 'Q') + interval '3' month -1 from dual ; 01-JUL-2018 30-JUN-2019 select TRUNC(to_date('30-MAR-2019')+1, 'Q') - interval '9' month,TRUNC(to_date('30-MAR-2019')+1, 'Q') + interval '3' month -1 from dual ; 01-APR-2018 31-MAR-2019
il donne le résultat du 5 trimestre ....... supposons que si j'exécute une requête aujourd'hui (16-AVR-2019), le résultat devrait être du 01-JUL-2018 au 30-JUN-2019. si je cours le 30-MAR-2019, le résultat devrait être du 01-AVR-2018 au 31-MAR-2019.
La partie la plus délicate est d'obtenir le dernier jour du trimestre.
Cette solution calcule le jour de départ de la fourchette en soustrayant 9 mois de la date cible puis en tronquant avec le masque 'Q'
qui nous donne le premier jour du trimestre. Nous calculons ensuite cette date à nouveau , soustrayons un jour puis ajoutons douze mois et cela donne le dernier jour du trimestre en cours:
with tgt as ( select date '2019-03-30' as dt from dual union all select date '2019-02-28' as dt from dual union all select date '2019-04-01' as dt from dual ) select trunc(tgt.dt - interval '9' month, 'Q') as range_st, (trunc(tgt.dt - interval '9' month, 'Q') - 1) + interval '12' month as range_end from tgt /
Il peut y avoir une solution plus astucieuse, mais c'est la fin de ma pause café :)
Ceci est dynamiquement:
With param as ( Select to_date(extract(year from add_months(sysdate,-12)) || lpad((floor(extract(month from add_months(sysdate,-12))/3)*3)+1,2, '0') || '01', 'yyyymmdd') first_date from dual ) Select level quartal, Add_months(first_date, ((level-1)*3)) from_dat, Last_day(add_months(first_date, ((level-1)*3)+3)-1) to_dat From param connect by level <= 4;