Questo otterrà la settimana (domenica - sabato) del 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
Spiegazione :
- Puoi trovare la domenica che era o appena prima di una data data usando
NEXT_DAY( TRUNC( date_value ), 'SUNDAY' ) - 7
(che dipende daNLS_TERRITORY
impostazione) oTRUNC( date_value + 1, 'IW' ) - 1
(che è più breve e non dipende da alcuna impostazione). TRUNC( date_value, 'Q' )
fornisce la data del primo giorno del trimestre contenente ilvalue
data (ovvero 1 gennaio, 1 aprile, 1 luglio o 1 ottobre).- Mettendo insieme i due, la domenica o appena prima del primo giorno del trimestre è data da
TRUNC( TRUNC( date_value, 'Q' ) + 1, 'IW' ) - 1
- Pertanto, il numero di giorni tra la domenica o appena prima dell'inizio del trimestre e la domenica o appena prima di una data data è:
( TRUNC( date_value + 1, 'IW' ) - 1 ) - ( TRUNC( TRUNC( date_value, 'Q' ) + 1, 'IW' ) - 1 )
- che può essere semplificato cancellando il-1
termini. - Il numero di settimane di differenza è solo quel numero diviso per 7 (ma fornisce un valore indicizzato 0 e vuoi che il numero della settimana del trimestre sia indicizzato a 1; aggiungi 1 settimana al risultato o, prima di facendo la divisione, aggiungi 7 giorni).