내용설명
최초 검사일로부터 2018년 5월 1일을 기준으로 이전은 +3년, 이후는 +4년씩 년수를 더하는 쿼리입니다.
마농님께서 알려주신 방법대로 적용해서 작동하는데 성공했고,
다시 쿼리 수정을 할려고 하는데 잘 안되는군요.
검사일자에 따라 +3~4년씩 유효기간 년수가 더해지다가 중간에 변경검사가 있으면 변경검사의 년월일부터 다시 (초기화)계산되어 +3~4년이 더해지도록 수정해야 합니다.(이때도 2018년 5월 1일 전후 쿼리는 적용되어야 함)
= 변경검사가 2018년 03월 13일이므로 (2018년 5월 1일 이전) 원하는 결과값은 2021년 03월 13일이 나와야 합니다.
변경검사시 INSKND의 값이 12입니다. (아래 표 노란색 셀)값이 12일 경우 날짜가 변경되는 것 까지는 성공했는데, 잘 안되는군요.
그래서 아래 표에서 보는 것과 같이 원하는 결과값대로 나와야 합니다.
요약
검사일로부터 유효기간이 +3년씩 더해지다가 2018년 05월 01일 이후부터는 +4년씩 년수가 더해집니다.
하지만 중간에 변경검사가 있으면 변경검사의 년월일로 적용되어 유효기간이 변경검사일로부터 다시 계산되어야 합니다.
도움 요청 드립니다.
감사합니다.
아래 쿼리의 결과
|
ROW_NUM |
RLTSEQ |
SUCNUM |
APCSEQ |
INSKND |
INSKND_1 |
MNFTNM |
SERIAL |
EQSTCD |
LGTSTD |
LGTCOR |
검사일자 |
유효기간 |
변경검사부터다시날짜계산 |
원하는결과값 |
비고 |
1 |
5 |
11221 |
21F054 |
10008433 |
11 |
정기검사 |
NH |
11231 |
10A201 |
100mm |
검정색 |
2021년 04월 29일 |
2028년 07월 13일 |
(null) |
2025년 03월 13일 |
변경검사 이후 +4년 |
2 |
4 |
80511 |
18C001 |
10006142 |
12 |
변경검사 |
NH |
11231 |
10A201 |
100mm |
검정색 |
2018년 03월 13일 |
2024년 07월 13일 |
2021년 03월 13일 |
2021년 03월 13일 |
변경검사의 년월일부터 다시 계산 |
3 |
3 |
72877 |
17F152 |
10005883 |
11 |
정기검사 |
NH |
11231 |
10A201 |
50mm |
검정색 |
2017년 10월 20일 |
2020년 07월 13일 |
(null) |
2020년 07월 13일 |
+3년 |
4 |
2 |
42489 |
14F117 |
10003259 |
11 |
정기검사 |
NH |
11231 |
10A201 |
50mm |
검정색 |
2014년 10월 10일 |
2017년 07월 13일 |
(null) |
2017년 07월 13일 |
+3년 |
5 |
1 |
11451 |
11B059 |
10000978 |
10 |
사용전검사 |
NH |
11231 |
10A201 |
50mm |
검정색 |
2011년 07월 13일 |
2014년 07월 13일 |
(null) |
2014년 07월 13일 |
최초검사일 |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
쿼리 내용
SELECT ROW_NUMBER() OVER(ORDER BY RLTSEQ) ROW_NUM
, NVL(A.RLTSEQ, '-') AS RLTSEQ
, NVL(A.SUCNUM, '-') AS SUCNUM
, NVL(A.APCSEQ, '-') AS APCSEQ
, NVL(A.INSKND, '-') AS INSKND
, NVL(GET_CODENAME('C405', A.INSKND), '-') AS INSKND
, NVL(A.MNFTNM, '-') AS MNFTNM
, NVL(A.SERIAL, '-') AS SERIAL
, NVL(A.EQSTCD, '-') AS EQSTCD
, NVL(GET_CODENAME('C408', A.LGTSTD), '-') AS LGTSTD
, NVL(A.LGTCOR, '-') AS LGTCOR
, A.INSDAT AS 검사일자
--, A.NXTDAT AS 유효기간
, TO_CHAR(ADD_MONTHS(dt, (rn * 3 + GREATEST(rn - x, 0)) * 12), 'yyyy"년" mm"월" dd"일"') AS 유효기간 --'yyyy"년" mm"월" dd"일"'
--, TO_CHAR(ADD_MONTHS(dt1, (rn1 * 3 + GREATEST(rn1 - x1, 0)) * 12), 'YYYY-MM-DD') AS 유효기간3 --'yyyy"년" mm"월" dd"일"'
,변경검사부터다시날짜계산
FROM (
SELECT B.RLTSEQ AS RLTSEQ
, ROW_NUMBER() OVER(ORDER BY B.RLTSEQ) rn
, MIN(TO_DATE(A.INSDAT, 'yyyymmdd')) OVER() dt
, CEIL(MONTHS_BETWEEN(TO_DATE('20180501', 'yyyymmdd') , MIN(TO_DATE(A.INSDAT, 'yyyymmdd')) OVER()) / 36) x
, CASE WHEN C.INSKND = '12' THEN TO_CHAR(ADD_MONTHS(TO_DATE(A.INSDAT),36), 'yyyymmdd') END AS 변경검사부터다시날짜계산
, B.SUCNUM AS SUCNUM
, A.APCSEQ AS APCSEQ
, C.INSKND AS INSKND
, A.MNFTNM AS MNFTNM
, A.SERIAL AS SERIAL
, A.EQSTCD AS EQSTCD
, A.LGTSTD AS LGTSTD
, (SELECT CODENM
FROM COMCODET
WHERE CODGRP = 'C208'
AND CMCODE = A.LGTCOR) AS LGTCOR
, TO_NUMBER(TO_CHAR(TO_DATE(A.INSDAT), 'YYYY')) || '년 '||
TO_NUMBER(TO_CHAR(TO_DATE(A.INSDAT), 'MM')) || '월 '||
TO_NUMBER(TO_CHAR(TO_DATE(A.INSDAT), 'DD')) || '일' AS INSDAT
, CASE WHEN TO_CHAR(TO_DATE(A.INSDAT), 'YYYY-MM-DD') >= '20180501' THEN
TO_CHAR(ADD_MONTHS(TO_DATE(A.INSDAT),48), 'YYYY') || '년 ' ||
TO_CHAR(ADD_MONTHS(TO_DATE(A.INSDAT),48), 'MM') || '월 ' ||
TO_CHAR(ADD_MONTHS(TO_DATE(A.INSDAT),48), 'DD') || '일 '
ELSE
TO_CHAR(ADD_MONTHS(TO_DATE(A.INSDAT),36), 'YYYY') || '년 ' ||
TO_CHAR(ADD_MONTHS(TO_DATE(A.INSDAT),36), 'MM') || '월 ' ||
TO_CHAR(ADD_MONTHS(TO_DATE(A.INSDAT),36), 'DD') || '일 '
END AS NXTDAT
FROM INSAPCDT A, INSRSLTT B, INSAPCMT C
WHERE A.LGTSEQ = B.LGTSEQ
AND A.APCSEQ = C.APCSEQ
AND B.INSRLT = '10'
AND A.SERIAL = '11231'
UNION ALL
SELECT A.RLTSEQ AS RLTSEQ
, ROW_NUMBER() OVER(ORDER BY A.RLTSEQ) rn
, MIN(TO_DATE(A.INSDAT, 'yyyymmdd')) OVER() dt
, CEIL(MONTHS_BETWEEN(TO_DATE('20180501', 'yyyymmdd') , MIN(TO_DATE(A.INSDAT, 'yyyymmdd')) OVER()) / 36) x
, CASE WHEN D.INSKND = '12' THEN TO_CHAR(ADD_MONTHS(TO_DATE(A.INSDAT),36), 'yyyymmdd') END AS 변경검사부터다시날짜계산
, A.SUCNUM AS SUCNUM
, C.APCSEQ AS APCSEQ
, D.INSKND AS INSKND
, A.MNFTNM AS MNFTNM
, A.SERIAL AS SERIAL
, B.EQSTCD AS EQSTCD
, A.STNDCD AS STNDCD
, A.LGTCOR AS LGTCOR
, A.INSDAT AS INSDAT
, A.SUCDUR AS NXTDAT
FROM OLDRSLTT A, INSRSLTT B, INSAPCDT C, INSAPCMT D
WHERE B.LGTSEQ = C.LGTSEQ AND C.APCSEQ = D.APCSEQ AND A.SERIAL = '11231' AND A.RLTSEQ=B.RLTSEQ(+)
) A
ORDER BY A.RLTSEQ DESC;
|