'(DB) DB2/공통 Function'에 해당되는 글 12건

  1. 2017.01.27 DB2.Funciton - 특정일자에_년수더하기
  2. 2017.01.27 DB2.일반함수 - 일자.시간.분_응용함수

[ DB2.Funciton - 특정일자에_년수더하기 ]

 

 

* 특정일자에 대하여 년수를 더한 일자가 반환됩니다 *

 

SET SCHEMA MISADM;

 

SET CURRENT PATH = "SYSIBM","SYSFUN","SYSPROC","MISADM";

 

CREATE FUNCTION COM.GET_ADDYEARS

 (ASDATE VARCHAR(8),

  ASYEARS INTEGER

 )

  RETURNS CHARACTER(8)

  SPECIFIC COM.GET_ADDYEARS

  LANGUAGE SQL

  DETERMINISTIC

  READS SQL DATA

  STATIC DISPATCH

  CALLED ON NULL INPUT

  EXTERNAL ACTION

  INHERIT SPECIAL REGISTERS

  BEGIN ATOMIC

    DECLARE vReturn CHAR(8);

    SET vReturn = (

      SELECT SUBSTR(REPLACE(CHAR(DATE(SUBSTR(asDate,1,4) ||'-'|| SUBSTR(asDate

          ,5,2) ||'-'|| SUBSTR(asDate,7,2)) + ASYEARS YEAR ),'-',''),1,8)

        FROM COM.Z_COMCDCOD_TBL

        FETCH FIRST 1 ROWS ONLY ) ;

    IF vReturn IS NULL THEN

      SET vReturn = '';

    END IF;

    RETURN vReturn;

  END;

 

COMMENT ON FUNCTION COM.GET_ADDYEARS

 (VARCHAR(8),

  INTEGER

 )

  IS '특정일자에 대하여 년수를 더한 일자가 반환됩니다.';

Posted by 농부지기
,

[ DB2.일반함수 - 일자.시간.분_응용함수 ]

 

 

1. 특정일자에 년수 더하기
      1.1 예제 1
             : SELECT current date + 1 YEAR FROM sysibm.sysdummy1
                    -> YEAR를 사용하면 YEAR앞쪽의 숫자를 연도로 변환시킨다.

        1.2 예제 2
            : arg : asDate : 문자형날짜
                      aiYear  : 더하고 싶은 년수(숫자형)

            :  SUBSTR(REPLACE(CHAR(DATE(SUBSTR(asDate,1,4) ||'-'|| SUBSTR(asDate,5,2) ||'-'|| SUBSTR(asDate,7,2)) + aiYear YEAR ),'-',''),1,8)

            : 쪼개기 : 1. 날짜를 '-' formatting 한다                             : (SUBSTR(asDate,1,4) ||'-'|| SUBSTR(asDate,5,2) ||'-'|| SUBSTR(asDate,7,2))
                           2. 문자형날짜를  Date 형으로 변환                    : (DATE( 1번결과 )
                           3. Date형에서 년수를 더한후 문자형으로 변환   : CHAR(2번결과  + aiYear YEAR )
                           4. '-'가 있는 문자형날짜를 '-'를 제거                : REPLACE(3번결과,'-','')
                           5. 문자형날짜에서 앞쪽 년월일만 취함               : SUBSTR(4번결과,1,8)

 

2. 특정일자에 월수 더하기
    : arg : asDate : 문자형날짜
              aiMonth  : 더하고 싶은 월수(숫자형)

    :  SUBSTR(REPLACE(CHAR(DATE(SUBSTR(asDate,1,4) ||'-'|| SUBSTR(asDate,5,2) ||'-'|| SUBSTR(asDate,7,2)) + aiMonth MONTH ),'-',''),1,8)

    : 쪼개기 : 1. 날짜를 '-' formatting 한다                                : (SUBSTR(asDate,1,4) ||'-'|| SUBSTR(asDate,5,2) ||'-'|| SUBSTR(asDate,7,2))
                   2. 문자형날짜를  Date 형으로 변환                      : (DATE( 1번결과 )
                   3. Date형에서 월수를 더한후 문자형으로 변환     : CHAR(2번결과  + aiMonth MONTH )
                   4. '-'가 있는 문자형날짜를 '-'를 제거                  : REPLACE(3번결과,'-','')
                   5. 문자형날짜에서 앞쪽 년월일만 취함                 : SUBSTR(4번결과,1,8)

 

3. 특정일자에 일수더하기
     3.1 예제 1
            : SELECT current date + 3 YEARS + 2 MONTHS + 15 DAYS  FROM sysibm.sysdummy1
                     -> YEARS, MONTHS, DAYS를 사용하면 앞쪽 숫자를 년/월/일로 변환시킨다.

     3.2 예제 2
            : arg : asDate : 문자형날짜
                       aiDays  : 더하고 싶은 일자(숫자형)

            :  SUBSTR(REPLACE(CHAR(DATE(SUBSTR(asDate,1,4) ||'-'|| SUBSTR(asDate,5,2) ||'-'|| SUBSTR(asDate,7,2)) + aiDays DAYS ),'-',''),1,8)

            : 쪼개기 : 1. 날짜를 '-' formatting 한다                                : (SUBSTR(asDate,1,4) ||'-'|| SUBSTR(asDate,5,2) ||'-'|| SUBSTR(asDate,7,2))
                           2. 문자형날짜를  Date 형으로 변환                      : (DATE( 1번결과 )
                           3. Date형에서 일수를 더한후 문자형으로 변환      : CHAR(2번결과  + aiDays DAYS )
                           4. '-'가 있는 문자형날짜를 '-'를 제거                  : REPLACE(3번결과,'-','')
                           5. 문자형날짜에서 앞쪽 년월일만 취함                 : SUBSTR(4번결과,1,8)

 

4. 시간:분:초 더하기
     1. 예제 1
              : SELECT current time + 5 HOURS - 3 MINUTES + 10 SECONDS FROM sysibm.sysdummy1
                          -> HOURS, MINUTES, SECONDS를 사용하면 앞쪽 숫자를 시간/분/초로 변환시킨다.

 

5. 두 날짜 사이의 간격구하기
     1. 예제 1
              : SELECT days (current date) - days (date('1999-10-22'))  FROM sysibm.sysdummy1

  

 

801. 날짜를 문자로 변환하기
    1. 예제 1
             : char(current date)
               char(current time)  
               char(current date + 12 hours)

802. 문자열을 날짜로 변환하기
    1. 예제 1
           : TIMESTAMP ('2002-10-20-12.00.00.000000')
             TIMESTAMP ('2002-10-20 12:00:00')
             DATE ('2002-10-20')
             DATE ('10/20/2002')
             TIME ('12:00:00')
             TIME ('12.00.00')

999. 잡다한거

  1. 다음은 마이크로초 부분을 0으로 재설정하고 현재 타임스탬프를 얻는 방법이다
        CURRENT TIMESTAMP - MICROSECOND (current timestamp) MICROSECONDS
  2. TIMESTAMP(), DATE(), TIME() 함수는 여러 포맷들을 허용한다.
  3. DATE 함수에서 쿼트를 없애면 어떻게 될까? 함수는 여전히 작동하겠지만 정확하지 않은 DATE가 나올 것이다.
         - SELECT DATE(2001-09-22) FROM SYSIBM.SYSDUMMY1;
         - 결과 : 05/24/0006
         - 이유 : 위 결과에서 어떻게 2000년 이나 차이가 났을까? DATE 함수가 입력으로 문자열을 취하면 DB2 날짜의 유효 문자로 간주되고,
                     따라서 이를 변환하는 것이다. 반대로, 입력이 숫자라면 이 함수는 현재 년도(0001-01-01)에서 1을 제한 날 수를 나타내는 것으로 간주한다.
                     위 쿼리에서 입력은 2001-09-22였고 이것은 (2001-9)-22과 동일하다. 또한 이것은 1970이다.
 4. 가끔씩, 두 개의 타임스탬프들이 어떻게 차이가 있는지 알아야 한다.
    이를 위해 DB2는 TIMESTAMPDIFF()라고 하는 빌트인 함수를 제공한다. 하지만 리턴된 값은 근사값이다.
    윤년을 고려하지 않고 한 달을 30일로만 가정하기 때문이다. 다음은 두 날짜들 간 차이를 찾아내는 방법이다.

     - timestampdiff (<n>, char( timestamp('2002-11-30-00.00.00')- timestamp('2002-11-08-00.00.00')))
        <n>의 자리에, 다음 값들을 사용하여 시간 단위를 나타낸다.
        1 = 초의 소수부분
        2 = 초
        4 = 분
        8 = 시간
        16 = 요일
        32 = 주
        64 = 달
        128 = 분기
        256 = 년
        timestampdiff()를 사용하면 날짜가 비교적 가까이 있을 때 더 정확한 결과가 나온다.
        보다 정확한 계산을 원하면 다음을 사용하여 시간 단위로(초 단위로) 차이를 결정한다.

 

Posted by 농부지기
,