두 날자 사이의 주차 1 7 4,741

by 트집이 [SQL Query] oracle plsql 주차 [2023.03.28 18:29:10]


안녕하세요. 항상 도움 주셔서 감사합니다.

두개의 기준 날자 사이의 주차를 계산 하고 싶은데요.

예를 들어서 기준날자가 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

감사합니다.

by 트집이 [2023.03.29 10:09:27]
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

이렇게 해 봤는데 주의 시작 기준이 일요일이 아닌게 문제인것 같네요. ㅠㅠ


by 우리집아찌 [2023.03.29 10:59:18]
-- 손으로 옮겨적어서 오타 있을수 있어요 .

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'

 


by 마농 [2023.03.29 17:51:31]

1. 지난 질문의 연장선 상의 질문이라면?
- 예시를 잘 못 들어 주셨네요.
- 시작, 종료일의 연도가 바뀌는 예를 들어 주시는게 좋습니다.
2. 시작, 종료일은 항상 일요일만 입력되나요?
- 일요일이 아닌 일자가 오는게 가능하다면?
- 그에 대한 예시와 결과표를 들어 주시는게 좋습니다.


by 트집이 [2023.03.30 09:37:49]
		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'

시작일과 종료일은 항상 일요일에 해당하는 일자만 가져오도록 쿼리 이전에 계산을 해서 넣어주고 있습니다.


by 마농 [2023.03.30 09:47:56]

 

-- 일요일을 시작일로 하여 시작일의 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
        )
;

 


by 트집이 [2023.03.30 09:59:25]

감사합니다.


by 김도희 [2023.09.27 15:41:21]

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;
 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입