안녕하세요. 항상 도움 주셔서 감사합니다.
두개의 기준 날자 사이의 주차를 계산 하고 싶은데요.
예를 들어서 기준날자가 2023-01-01, 2023-02-05 일 이라면 두 날자 사이에 해당하는 주차를 가져면 됩니다.
주차의 시작요일은 일요일을 기준으로 합니다.
| START_DT | WEEK | |
| 2023-01-01 | 1 | |
| 2023-01-08 | 2 | |
| 2023-01-15 | 3 | |
| 2023-01-22 | 4 | |
| 2023-01-29 | 5 | |
| 2023-02-05 | 6 | |
감사합니다.
SELECT LEVEL BETWEEN_DT
, TO_CHAR(START_DATE + LEVEL * 7 - 7,'WW') WEEK
, TO_CHAR(START_DATE + LEVEL * 7 - 7, 'yyyy-mm-dd') SDT
, TO_CHAR(START_DATE + LEVEL * 7 - 1, 'yyyy-mm-dd') EDT
FROM (
SELECT TRUNC(TO_DATE('2022-11-13'), 'd') START_DATE
, TRUNC(TO_DATE('2023-02-05'), 'd') END_DATE
, (TRUNC(TO_DATE('2023-02-05'), 'd') - TRUNC(TO_DATE('2022-11-13'), 'd')) / 7 + 1 BETWEEN_DT
FROM DUAL
)
CONNECT BY LEVEL <= BETWEEN_DT
이렇게 해 봤는데 주의 시작 기준이 일요일이 아닌게 문제인것 같네요. ㅠㅠ
-- 손으로 옮겨적어서 오타 있을수 있어요 .
SELECT DT
, TO_CHAR(DT,'DAY') DAY
, TO_CHAR(DT,'WW') WEEK
FROM ( SELECT TO_DATE('20230101','YYYYMMDD') + LEEL - 1 DT
FROM DUAL CONNECT BY LEVEL <= TO_DATE('20230205','YYYYMMDD') - TO_DATE('20230101' ,'YYYYMMDD') + 1
)
WHERE TO_CHAR(DT,'D') = '1'
1. 지난 질문의 연장선 상의 질문이라면?
- 예시를 잘 못 들어 주셨네요.
- 시작, 종료일의 연도가 바뀌는 예를 들어 주시는게 좋습니다.
2. 시작, 종료일은 항상 일요일만 입력되나요?
- 일요일이 아닌 일자가 오는게 가능하다면?
- 그에 대한 예시와 결과표를 들어 주시는게 좋습니다.
SELECT 'W' || TO_CHAR(DT,'WW') WEEK
FROM (
SELECT TO_DATE('20221218','YYYYMMDD') + LEVEL - 1 DT
FROM DUAL
CONNECT BY LEVEL <= TO_DATE('20230115','YYYYMMDD') - TO_DATE('20221211' ,'YYYYMMDD') + 1
)
WHERE TO_CHAR(DT,'D') = '1'
시작일과 종료일은 항상 일요일에 해당하는 일자만 가져오도록 쿼리 이전에 계산을 해서 넣어주고 있습니다.
-- 일요일을 시작일로 하여 시작일의 WW 를 가져오면 문제가 없을 듯 합니다.
SELECT lv
, (sdt - NEXT_DAY(TRUNC(sdt, 'yyyy') - 1, 1)) / 7 + 1 ww_1
, TO_CHAR(sdt, 'ww') ww_2
, TO_CHAR(sdt, 'yyyy-mm-dd') sdt
, TO_CHAR(edt, 'yyyy-mm-dd') edt
FROM (SELECT LEVEL lv
, sdt + LEVEL*7 - 7 sdt
, sdt + LEVEL*7 - 1 edt
FROM (SELECT TRUNC(TO_DATE('2022-11-13', 'yyyy-mm-dd'), 'd') sdt
, TRUNC(TO_DATE('2023-02-05', 'yyyy-mm-dd'), 'd') edt
FROM dual
)
CONNECT BY LEVEL <= (edt - sdt) / 7 + 1
)
;
감사합니다.
select dt as start_dt,
lvf+1 as week
from (select to_date('20230101','yyyy/mm/dd')+level-1 dt ,(level-1)/7 as lvf, mod(level-1,7) as lvt
from dual
connect by level<=to_date('20230205','yyyy/mm/dd')-to_date('20230101','yyyy/mm/dd')+1)
where lvt=0;