Това ще получи седмицата (неделя - събота) на тримесечието:
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
Обяснение :
- Можете да намерите неделята, която е била на или непосредствено преди дадена дата, като използвате
NEXT_DAY( TRUNC( date_value), 'НЕДЕЛЯ') - 7
(което зависи отNLS_TERRITORY
настройка) илиTRUNC( date_value + 1, 'IW' ) - 1
(което е по-кратко и не зависи от никакви настройки). TRUNC( стойност_на_дата, 'Q' )
дава датата на първия ден от тримесечието, съдържащастойността
дата (т.е. 1 януари, 1 април, 1 юли или 1 октомври).- Събирайки двете заедно, неделята на или непосредствено преди първия ден от тримесечието се дава от
TRUNC( TRUNC( date_value, 'Q' ) + 1, 'IW' ) - 1код>
- Следователно броят на дните между неделята на или точно преди началото на тримесечието и неделята на или точно преди дадена дата е:
( TRUNC( date_value + 1, ' IW' ) - 1 ) - ( TRUNC( TRUNC( стойност_на_дата, 'Q' ) + 1, 'IW' ) - 1 )
- което може да бъде опростено чрез отмяна на-1
условия. - Разликата в броя на седмиците е само това число, разделено на 7 (но дава индексирана с 0 стойност и искате номерът на седмицата на тримесечието да бъде индексиран с 1; добавяте или 1 седмица към резултата, или преди извършвайки разделянето, добавете 7 дни).