Cela obtiendra la semaine (dimanche - samedi) du trimestre :
SELECT TO_CHAR( SYSDATE, 'YYYY-"Q"Q-"W"' )
|| ( 7 + TRUNC( SYSDATE + 1, 'IW' ) - TRUNC( TRUNC( SYSDATE, 'Q' ) + 1, 'IW' ) ) / 7;
AS "Current Time"
FROM DUAL
Explication :
- Vous pouvez trouver le dimanche qui était soit le soit juste avant une date donnée en utilisant
NEXT_DAY( TRUNC( date_value ), 'SUNDAY' ) - 7
(qui dépend duNLS_TERRITORY
paramètre) ouTRUNC( date_value + 1, 'IW' ) - 1
(qui est plus court et ne dépend d'aucun paramètre). TRUNC( date_value, 'Q' )
donne la date du premier jour du trimestre contenant lavalue
date (c'est-à-dire le 1er janvier, le 1er avril, le 1er juillet ou le 1er octobre).- En rassemblant les deux, le dimanche le ou juste avant le premier jour du trimestre est donné par
TRUNC( TRUNC( date_value, 'Q' ) + 1, 'IW' ) - 1
- Par conséquent, le nombre de jours entre le dimanche le ou juste avant le début du trimestre et le dimanche le ou juste avant une date donnée est :
( TRUNC( date_value + 1, 'IW' ) - 1 ) - ( TRUNC( TRUNC( date_value, 'Q' ) + 1, 'IW' ) - 1 )
- qui peut être simplifié en supprimant le-1
termes. - La différence du nombre de semaines est juste ce nombre divisé par 7 (mais donne une valeur indexée sur 0 et vous voulez que le numéro de semaine du trimestre soit indexé sur 1 ; soit vous ajoutez 1 semaine au résultat, soit, avant faire la division, ajouter 7 jours).