Otrzymasz tydzień (niedziela - sobota) kwartału:
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
Wyjaśnienie :
- Możesz znaleźć niedzielę, która przypadała w tym dniu lub tuż przed określoną datą, używając
NEXT_DAY(TRUNC(data_value), 'SUNDAY') - 7
(który jest zależny odNLS_TERRITORY
ustawienie) lubTRUNC( wartość_daty + 1, 'IW' ) - 1
(która jest krótsza i nie zależy od żadnych ustawień). TRUNC(data_wartość, 'Q')
podaje datę pierwszego dnia kwartału zawierającąwartość
data (tj. 1 stycznia, 1 kwietnia, 1 lipca lub 1 października).- Łącząc te dwa elementy, niedziela w dniu lub tuż przed pierwszym dniem kwartału jest określana jako
TRUNC(TRUNC(data_value, 'Q' ) + 1, 'IW' ) - 1
- Dlatego liczba dni między niedzielą lub tuż przed początkiem kwartału a niedzielą w dniu lub tuż przed daną datą wynosi:
( TRUNC( wartość_daty + 1, ' IW' ) - 1 ) - ( AKTUALNE( AKTUALNE( wartość_data; 'Q' ) + 1, 'IW' ) - 1 )
- co można uprościć, anulując-1
warunki. - Różnica liczby tygodni to tylko ta liczba podzielona przez 7 (ale daje wartość indeksowaną 0 i chcesz, aby numer tygodnia kwartału był indeksowany 1; dodajesz 1 tydzień do wyniku lub przed robiąc podział, dodaj 7 dni).