database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 41858 게시물 읽기
No. 41858
최초검사일 기준으로 표시되는 유효기간 수정 방법 문의
작성자
노진규(nojinkyu)
작성일
2021-07-07 18:15
조회수
2,436

내용설명

2018년 05월 01일 기준으로 이전에 검사한 장비는 유효기간이 3년, 이후에는 4년으로 원하는 결과값이 나오게 하고 싶습니다.

최초검사일이 2011년 09월 19일이고 3년씩 계산되다가 2018년 05월 01일 이후 검사한 장비는 4년씩 계산되어야 하는데 잘 안되네요.

최초검사일자의 월, 일이 계속 따라가야 하고요.


도움 부탁드립니다.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

쿼리결과

  201년 05월 01일 이전에는 유효기간이 3년, 이후에는 4년입니다.
  ROW_NUM SERIAL 검사일자 유효기간(현재 사용중) 유효기간테스트1 원하는결과값 비고
  4 11231 2021년 01월 06일 2025년 01월 06일 2019년 11월 13일 2024년 09월 19일 +4년
  3 11231 2019년 11월 13일 2023년 11월 13일 2015년 11월 26일 2020년 09월 19일 +3년
  2 11231 2015년 11월 26일 2018년 11월 26일 2011년 09월 19일 2017년 09월 19일 +3년
최초검사일 1 11231 2011년 09월 19일 2014년 09월 19일 0 2014년 09월 19일 +3년


---------------------------------------------------------------------------------------------------------------------------------------------------------

쿼리문

SELECT    ROW_NUMBER() OVER(ORDER BY RLTSEQ) ROW_NUM

          , NVL(A.SERIAL, '-')      AS SERIAL

          , A.INSDAT      AS 검사일자

          , A.NXTDAT      AS 유효기간

          --TO_CHAR(ADD_MONTHS(TO_DATE(A.INSDAT),36), 'YYYY') || '년 ' ||

          , LAG(A.INSDAT,1,0) OVER(ORDER BY NXTDAT) 유효기간테스트1

          , LAG(A.INSDAT,1,0) OVER(ORDER BY NXTDAT) 원하는결과값

  FROM    (

          SELECT    B.RLTSEQ                                AS RLTSEQ

                    , B.SUCNUM                              AS SUCNUM

                    , 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

                  --, A.INSDAT                              AS INSDAT

                  --  , 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

                 

                --  , A.INSDAT                              AS INSDAT

                    , 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

                 

                  --, GET_EXPDAT(A.MNFTNO, A.INSDAT)        AS NXTDAT

                    , CASE WHEN TO_CHAR(TO_DATE(A.INSDAT), 'YYYY-MM-DD') >= '2018-05-01' 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

           WHERE    A.LGTSEQ = B.LGTSEQ

             AND    B.INSRLT = '10'

             AND    A.SERIAL = '11231'

           UNION ALL

          SELECT    A.RLTSEQ       AS RLTSEQ

                    , A.SUCNUM     AS SUCNUM

                    , 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

            WHERE    A.SERIAL = '11231'  AND A.RLTSEQ=B.RLTSEQ(+)

          ) A

 ORDER BY A.RLTSEQ DESC;


 

이 글에 대한 댓글이 총 2건 있습니다.
WITH t AS
(
SELECT 1 rltseq, 11231 serial, '20110919' insdat FROM dual
UNION ALL SELECT 2, 11231, '20151126' FROM dual
UNION ALL SELECT 3, 11231, '20191113' FROM dual
UNION ALL SELECT 4, 11231, '20210106' FROM dual
)
SELECT rn
     , rltseq

     , serial
     , TO_CHAR(insdat, 'yyyy"년" mm"월" dd"일"') insdat
     , TO_CHAR(
       ADD_MONTHS(dt, (rn * 3 + GREATEST(rn - x, 0)) * 12)
       , 'yyyy"년" mm"월" dd"일"') nxtdat
  FROM (SELECT ROW_NUMBER() OVER(ORDER BY rltseq) rn
             , rltseq
             , serial
             , TO_DATE(insdat, 'yyyymmdd') insdat
             , MIN(TO_DATE(insdat, 'yyyymmdd')) OVER() dt
             , CEIL(MONTHS_BETWEEN(TO_DATE('20180501', 'yyyymmdd')
                    , MIN(TO_DATE(insdat, 'yyyymmdd')) OVER()) / 36)
x
          FROM t
         WHERE serial = 11231
        )
 ORDER BY rn DESC
;

 
마농(manon94)님이 2021-07-09 07:34에 작성한 댓글입니다.
이 댓글은 2021-07-13 16:18에 마지막으로 수정되었습니다.

마농님께서 알려주신 내용대로 적용해서 잘 작동합니다.

감사합니다.

노진규(nojinkyu)님이 2021-08-03 15:44에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
41863WITH 임시테이블로 여러 count 조회시 질문드려요.
비건
2021-07-31
2181
41862count 여러개 조회할때 질문드립니다.
비건
2021-07-31
2129
41859접속 모듈 OraPgm
궁금이
2021-07-23
1995
41858최초검사일 기준으로 표시되는 유효기간 수정 방법 문의 [2]
노진규
2021-07-07
2436
41857level-1 계산하여 데이터 조회하기 [3]
차상환
2021-07-06
2384
41856조인시 실행계획에서 풀스캔 [1]
라라라
2021-07-02
2547
41853풀스캔 질문 드립니다 [2]
궁금이
2021-05-27
2702
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.054초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다