Detta kommer att få veckan (söndag - lördag) i kvartalet:
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
Förklaring :
- Du kan hitta söndagen som var antingen på eller strax före ett givet datum med
NEXT_DAY( TRUNC( date_value ), 'SUNDAY' ) - 7
(vilket är beroende avNLS_TERRITORY
inställning) ellerTRUNC( datum_värde + 1, 'IW' ) - 1
(vilket är kortare och inte beroende av några inställningar). TRUNC( datum_värde, 'Q' )
anger datumet för den första dagen i kvartalet som innehållervärdet
datum (dvs. antingen 1 januari, 1 april, 1 juli eller 1 oktober).- Om de två sätts samman, söndagen på eller strax före den första dagen i kvartalet ges av
TRUNC( TRUNC( date_value, 'Q' ) + 1, 'IW' ) - 1
- Därför är antalet dagar mellan söndagen på-eller-precis-före början av kvartalet och söndagen på-eller-precis-före ett givet datum:
( TRUNC( datum_värde + 1, ' IW' ) - 1 ) - ( TRUNC( TRUNC( datum_värde, 'Q' ) + 1, 'IW' ) - 1 )
- vilket kan förenklas genom att avbryta-1
villkor. - Antalet veckors skillnad är bara det siffran delat med 7 (men ger ett 0-indexerat värde och du vill att veckotalet för kvartalet ska vara 1-indexerat; antingen lägger du till 1 vecka till resultatet eller, före gör divisionen, lägg till 7 dagar).