(재요청)기간 구간정보 조회 질문 드립니다. 1 6 4,499

by 미들타이거 [SQL Query] #구간조회 #spl [2024.03.27 18:29:36]


안녕하세요 지난 아래 링크에서 질문 했었던건 있었습니다.

http://www.gurubee.net/article/87918

제가 결과값에 대한 세팅을 잘못 표시한 부분이 있어 재 질문 드립니다.ㅠㅠ

기존 결과값 입니다.

WITH tab_a AS
(
SELECT '2023-05-22' strt_dt, '2023-12-31' end_dt, 365 year_cnt FROM dual
UNION ALL SELECT '2024-01-01', '2024-01-14', 366 FROM dual
)
, tab_b AS
(
SELECT '2023-01-01' strt_dt, '2023-09-15' end_dt, 1 rt FROM dual
UNION ALL SELECT '2023-09-16', '2023-12-25', 3 FROM dual
UNION ALL SELECT '2023-12-26', '9999-12-31', 5 FROM dual
)
SELECT GREATEST(a.strt_dt, b.strt_dt) strt_dt
     , LEAST(a.end_dt, b.end_dt) end_dt
     , a.year_cnt
     , b.rt
  FROM tab_a a
     , tab_b b
 WHERE a.strt_dt <= b.end_dt
   AND b.strt_dt <= a.end_dt
;

 

수정 결과 값으로 아래와 같이 나올려면 어떻게 해야 할까요?

결과

STRT DT       END_DT        YEAR_CNT  RT
2023-05-22  2023-09-15      365            1
2023-09-15  2023-12-25      365            3
2023-12-25  2023-12-31      365            5
2023-12-31 2024-01-14       366            5

 

 

by 마농 [2024.03.28 09:21:28]

왜 그렇게 나와야 하나요?


by 미들타이거 [2024.03.28 16:53:12]

안녕하세요 마농님

이전에 도움 주셔서 매우 감사드립니다. ^^

해당 사유는 이자율에 따른 금액 계산을 하기 위해서 입니다.

2023-05-22 ~ 2024-01-14 까지 이자 금액 계산을 하려고 하는데 계산시 년도 일수에 따른 365과 366일 계산을 합니다.

그사이에 이자율 적용 기간에 따라 적용하여 금액 계산을 다른게 합니다.

그래서 가져온 결과 값으로 일자 계산을 하는데 아래 기존 결과에서는 구간별로 1일씩 차이가 있어 총 3일에 차이가 생기게 됩니다.

  기간시작 기간종료 총일수    
  2023-05-22 2024-01-14 237    
           
  결과값     종료일부터 계산일수 차이일수
1 2023-05-22 2023-09-15 116 116 0
2 2023-09-16 2023-12-25 100 101 -1
3 2023-12-26 2023-12-31 5 6 -1
4 2024-01-01 2024-01-14 13 14 -1
      234   -3

그래서 구간의 종료일자가 다음 구간의 시작일자로 되어야 일자 계산 되어 다시한번 도움을 요청 드렸습니다.^^;;

이해가 되셨을지 모르겠네요~ㅠ


by 마농 [2024.03.28 20:35:47]

첫날은 일수 계산에서 제외되는가 보네요?
일수는 다음과 같이 계산 됩니다.
일수 = 종료일 - 시작일 + 1
첫행만 1을 빼주면 될 듯 한데요?
굳이 날짜를 고쳐야 하나요? 일수 계산식만 고치면 되지 않나요?
굳이 날짜를 고친다면 나머지는 그대로 두고, 차라리 첫줄의 시작일에 1을 더하는게 맞지 않나요?


by 미들타이거 [2024.04.01 12:51:47]

안녕하세요~답변이 늦었습니다.

네~이해 하신대로 당일은 1일로 치지 않습니다.

그래서 사실상 A테이블의 기간에 B의 RT값이 변하는 시작일자가 계산의 바뀌는 시점으로

해야 일수가 정확히 맞아 떨어지게 됩니다.

말씀하신 방법은첫행만 1일을 뺀다는게 이해를 못했습니다.^^;;


by 마농 [2024.04.01 14:43:49]

1. 제가 생각하는 일수는 (종료일 - 시적일 + 1) 입니다.
- 이 식에 대입하면 첫번째 행만 하루 오차가 생기지요.
- 따라서 첫행만 보정하면 됩니다.
2. 그런데 질문의 내용을 보면 일수 계산이.
- (종료일 - 시적일 + 1) 이 아닌 (종료일 - 시적일) 을 하는 모양이네요.
- 그래서 첫행만 맞게 나오고 나머지 행이 다르게 나오는 거겠죠?
3. 원하는 대로 답변 드리는 것은 다양한 방식으로 가능합니다.
- 다만 저는 그게 맞는가 의구심이 들어서 그런거에요,
- 처음엔 의도를 몰라 왜 그래야 하는가? 질문한 것이고
- 두번째에는 하루가 다른 이유에 대해 알게 됬지만
- 그에 대한 해결방법이 이게 맞는가? 싶었던 것이죠.

○ 원하는 것을 해결하는 방안
- LAG 를 이용하여 이전 종료일로 대체하는 방안
- ROWNUM 을 이용하여 첫행일 때와 아닐 때를 구별하여 처리하는 방안

○ 여러가지 방안이 있을 수 있는데.
1. 시작일 종료일은 그대로 두고 일수계산만 다르게 적용하는 방안
- 첫행에만 일수 계산시 -1
2. 첫행의 시작일을 바꾸는 방안
- 첫행에만 +1 일
3. 첫행을 제외한 나머지 행들의 시작일을 바꾸는 방안
- 시작일 - 1일 (질문자가 요청한 방안)

저는 의미상으로 3안 보다는 1,2 안이 더 적절하다고 생각했습니다.


by 미들타이거 [2024.04.19 14:40:42]

안녕하세요 마농님

답변이 늦었습니다.

다른일 처리로 이제야 해당건을 정리 하여 적용 했습니다.

조언 해주신 부분 에서 LAG 대신 LEAD로 다은행 시작일을 종료일로 세팅 하여 기간을 맞춰습니다.

날짜에 대한 개념이 맞춰진대로 진행 하는게 계산상 편할것 같아 그렇게 정리했습니다.

테스트 한결과도 잘나오더라고요~

방법이 떠오르지 않았는데 관심갖고 조언해주셔서 매우 고맙습니다. ^^

건강하세요~

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