Isso obterá a semana (domingo - sábado) do 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
Explicação :
- Você pode encontrar o domingo que foi ou um pouco antes de uma determinada data usando
NEXT_DAY( TRUNC( date_value ), 'SUNDAY' ) - 7
(que depende doNLS_TERRITORY
configuração) ouTRUNC( date_value + 1, 'IW' ) - 1
(que é mais curto e não depende de nenhuma configuração). TRUNC( date_value, 'Q' )
dá a data do primeiro dia do trimestre que contém ovalor
data (ou seja, 1º de janeiro, 1º de abril, 1º de julho ou 1º de outubro).- Juntando os dois, o domingo anterior ou anterior ao primeiro dia do trimestre é dado por
TRUNC( TRUNC( date_value, 'Q' ) + 1, 'IW' ) - 1
- Portanto, o número de dias entre o domingo anterior ao início do trimestre e o domingo anterior a uma determinada data é:
( TRUNC( date_value + 1, ' IW' ) - 1 ) - ( TRUNC( TRUNC( valor_data, 'Q' ) + 1, 'IW' ) - 1 )
- que pode ser simplificado cancelando o-1
termos. - A diferença do número de semanas é apenas esse número dividido por 7 (mas fornece um valor indexado a 0 e você deseja que o número da semana do trimestre seja indexado a 1; você adiciona 1 semana ao resultado ou, antes de fazendo a divisão, adicione 7 dias).