it-source

Oracle에서 일주일 중 첫 번째와 마지막 날을 얻는 방법은 무엇입니까?

criticalcode 2023. 7. 20. 21:59
반응형

Oracle에서 일주일 중 첫 번째와 마지막 날을 얻는 방법은 무엇입니까?

다음과 같은 형식을 가진 문자열에서 첫 번째 날과 마지막 날을 가져와야 합니다.

'201118'

여기서 2011은 연도이고 18은 주의 숫자입니다.주수를 알고 있는데, 주수의 첫 날과 마지막 날은 어떻게 알 수 있습니까?

이거 어떻게 하는 거지?

일주일

select TRUNC(sysdate, 'iw') AS iso_week_start_date,
       TRUNC(sysdate, 'iw') + 7 - 1/86400 AS iso_week_end_date
from dual;

select 
TRUNC (sysdate, 'mm') AS month_start_date,
LAST_DAY (TRUNC (sysdate, 'mm')) + 1 - 1/86400 AS month_end_date
from dual;

Oracle을 사용하는 경우 이 코드를 사용하면 다음과 같은 이점이 있습니다.

select 
TRUNC(sysdate, 'YEAR') Start_of_the_year,
TRUNC(sysdate, 'MONTH') Start_of_the_month,
TRUNC(sysdate, 'DAY') start_of_the_week,
TRUNC(sysdate+365, 'YEAR')-1 End_of_the_year,
TRUNC(sysdate+30, 'MONTH')-1 End_of_the_month,
TRUNC(sysdate+6, 'DAY')-1 end_of_the_week
from dual;


select 
TRUNC(sysdate, 'YEAR') Start_of_the_year,
TRUNC(sysdate+365, 'YEAR')-1 End_of_the_year,
TRUNC(sysdate, 'MONTH') Start_of_the_month,
TRUNC(sysdate+30, 'MONTH')-1 End_of_the_month,
TRUNC(sysdate, 'DAY')+1 start_of_the_week,  -- starting Monday
TRUNC(sysdate+6, 'DAY') end_of_the_week     -- finish Sunday
from dual;
SQL> var P_YEARWEEK varchar2(6)
SQL> exec :P_YEARWEEK := '201118'

PL/SQL procedure successfully completed.

SQL> with t as
  2  ( select substr(:P_YEARWEEK,1,4) year
  3         , substr(:P_YEARWEEK,5,2) week
  4      from dual
  5  )
  6  select year
  7       , week
  8       , trunc(to_date(year,'yyyy'),'yyyy')                              january_1
  9       , trunc(trunc(to_date(year,'yyyy'),'yyyy'),'iw')                  monday_week_1
 10       , trunc(trunc(to_date(year,'yyyy'),'yyyy'),'iw') + (week - 1) * 7 start_of_the_week
 11       , trunc(trunc(to_date(year,'yyyy'),'yyyy'),'iw') + week  * 7 - 1  end_of_the_week
 12    from t
 13  /

YEAR WE JANUARY_1           MONDAY_WEEK_1       START_OF_THE_WEEK   END_OF_THE_WEEK
---- -- ------------------- ------------------- ------------------- -------------------
2011 18 01-01-2011 00:00:00 27-12-2010 00:00:00 25-04-2011 00:00:00 01-05-2011 00:00:00

1 row selected.

안부 전해요,

SELECT NEXT_DAY (TO_DATE ('01/01/'||SUBSTR('201118',1,4),'MM/DD/YYYY')+(TO_NUMBER(SUBSTR('201118',5,2))*7)-3,'SUNDAY')-7 first_day_wk,
    NEXT_DAY (TO_DATE ('01/01/'||SUBSTR('201118',1,4),'MM/DD/YYYY')+(TO_NUMBER(SUBSTR('201118',5,2))*7)-3,'SATURDAY') last_day_wk FROM dual

1년의 첫날과 비교하여 몇 주를 의미한다고 가정하면...

SELECT first_day_of_week, first_day_of_week+6 last_day_of_week
FROM (
  SELECT TO_DATE(YEAR||'0101','YYYYMMDD') + 7 * (week-1) first_day_of_week
  FROM (
    SELECT substr(yearweek,1,4) YEAR, to_number(substr(yearweek,5)) week
    FROM (
      SELECT '201118' yearweek FROM dual
    )
  )
)
;
SELECT TRUNC(SYSDATE,'D') "1ST_DAY", TRUNC(SYSDATE,'D') + 6 LAST_DAY FROM DUAL

다음과 같은 방법을 시도할 수 있습니다.

  1. 현재 날짜를 가져옵니다.

  2. 현재 날짜의 연도와 지정된 연도 간의 차이와 동일한 연도 수를 추가합니다.

  3. 마지막으로 얻은 날짜의 요일 번호인 일 수를 뺍니다. 그러면 특정 주의 마지막 날이 표시됩니다.

  4. 마지막으로 얻은 날짜의 주 번호와 지정된 주 번호 간의 차이인 주 수를 추가하고 원하는 주의 마지막 날을 산출합니다.

  5. 첫 번째 날을 얻으려면 6일을 빼십시오.

일회성 데이터 변환이 아닌 한 달력 표를 사용하면 이점을 얻을 수 있습니다.

이러한 테이블을 사용하면 일반적인 ISO 주뿐만 아니라 비표준 기간에 대한 데이터를 필터링하거나 집계하기가 매우 쉽습니다.몇 주는 대개 회사와 그 안에 있는 부서에 따라 약간 다르게 행동합니다."ISO-land"를 떠나자마자 내장된 날짜 기능은 도움이 되지 않습니다.

create table calender(
   day           date      not null -- Truncated date
  ,iso_year_week number(6) not null -- ISO Year week  (IYYYIW)
  ,retail_week   number(6) not null -- Monday to Sunday (YYYYWW)
  ,purchase_week number(6) not null -- Sunday to Saturday (YYYYWW)
  ,primary key(day)
);

"purchase_weeks" 또는 "retail_weeks"에 대한 추가 테이블을 생성하거나 즉시 집계할 수 있습니다.

select a.colA
      ,a.colB
      ,b.first_day
      ,b.last_day
  from your_table_with_weeks a
  join (select iso_year_week
              ,min(day) as first_day
              ,max(day) as last_day
          from calendar
         group  
            by iso_year_week
       ) b on(a.iso_year_week = b.iso_year_week)

많은 수의 레코드를 처리하는 경우 즉시 집계해도 큰 차이가 없지만, 단일 행을 수행하는 경우 몇 주 동안 테이블을 생성할 수 있습니다.

달력 표를 사용하면 최적화 도구가 내포된 열보다 정적 열에 대해 더 나은 추정치를 제공할 수 있다는 점에서 미묘한 성능 이점을 제공합니다.add_months(to_date(to_char()))함수 호출

또 다른 솔루션(월요일이 첫 번째 날):

select 
    to_char(sysdate - to_char(sysdate, 'd') + 2, 'yyyymmdd') first_day_of_week
    , to_char(sysdate - to_char(sysdate, 'd') + 8, 'yyyymmdd') last_day_of_week
from
    dual

또 다른 해결책은

SELECT 
  ROUND((TRUNC(SYSDATE) - TRUNC(SYSDATE, 'YEAR')) / 7,0) CANTWEEK,
  NEXT_DAY(SYSDATE, 'SUNDAY') - 7 FIRSTDAY,
  NEXT_DAY(SYSDATE, 'SUNDAY') - 1 LASTDAY
FROM DUAL

당신은 캔트위크를 연도와 일치시켜야 합니다.

@만일의 대답, 결점이 있습니다, 만약에.sysdate일요일이고 다음 주 월요일을 반환합니다.그의 답변에 영감을 받아 몇 주 동안 테스트한 내용을 소개합니다.

select 
    (sysdate - to_char(sysdate-1, 'd') + 1) first_day_of_week --A monday here
from dual

사실, 저는 다음과 같은 일을 했습니다.

    select case myconfigtable.valpar
       when 'WEEK' then to_char(next_day(datetime-7,'Monday'),'DD/MM/YYYY')|| ' - '|| to_char(next_day(datetime,'Sunday'),'DD/MM/YYYY')
       when 'MONTH' then to_char(to_date(yearweek,'yyyyMM'),'DD/MM/YYYY')  || ' - '|| to_char(last_day(to_date(yearweek,'yyyyMM')),'DD/MM/YYYY')
       else 'NA'
       end
from
(
select to_date(YEAR||'01','YYYYMM') + 7 * (WEEK - 1) datetime, yearweek
       from
       (
       select substr(yearweek,1,4) YEAR,
              to_number(substr(yearweek,5)) WEEK,
              yearweek
       from (select '201018' yearweek from dual
            )
       )
), myconfigtable myconfigtable
 where myconfigtable.codpar='TYPEOFPERIOD'
  • 리스트 항목

Truc(sysdate, 'DAY')합니다.

  • 리스트 항목

Truc(sysdate, 'DAY')+1합니다.

저는 이것이 단순한 선택적 진술이라고 생각합니다.집에서 테스트할 수 없었기 때문에, 여기에 오라클 데이터베이스가 없기 때문에, 잘 되길 바랍니다;-)

select to_date('201118', 'YYYYWW'), to_date('201118', 'YYYYWW')+7 from dual;

WW와 IW는 차이가 있기 때문에 조심해야 합니다.차이를 설명하는 기사가 있습니다. http://rwijk.blogspot.com/2008/01/date-format-element-ww.html

첫째 주(월요일):

SELECT TO_DATE(to_char(sysdate,'YYYY')||'0101','YYYYMMDD') + 7 * to_number(to_char(sysdate,'WW')-1)-1 first_day_week FROM dual;

주의 마지막 날(일요일):

SELECT TO_DATE(to_char(sysdate,'YYYY')||'0101','YYYYMMDD') + 7 * to_number(to_char(sysdate,'WW')-1)+5 last_day_week FROM dual;

이러한 공식에서 날짜 또는 날짜 필드를 대체하면 효과가 있습니다!

언급URL : https://stackoverflow.com/questions/5515514/how-to-get-first-and-last-day-of-week-in-oracle

반응형