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
운영게시판
최근게시물
Informix Q&A 2093 게시물 읽기
No. 2093
두날짜사이의 개월수 구하기
작성자
정건호
작성일
2004-12-14 23:26
조회수
9,498

두날자 사이의 개월수를 구하고싶습니다.

예를 들어 20041214 ~ 20061214 하면 24 를 구하고 싶습니다.

 

이 글에 대한 댓글이 총 2건 있습니다.

예전에 Oracle에는 MONTHS_BETWEEN 이란 함수가 있어 개월 수를

계산에 사용했는데, Informix에는 없어 제가 한 방법은 Stored procedure를 만들어 SQL에서 사용했었습니다.

 

/*@****************************************************************************/
/* 1. 프로그램 ID : MONTHS_BETWEEN                                            */
/* 2. 유       형 : Stored Procedure                                          */
/* 3. 기 능 정 의 :                                                           */
/*                  기간에 대한 월수를 계산한다.                              */
/* 4. 입 력 변 수 :                                                           */
/*                  시작일자(fr_dt )                                          */
/*                  종료일자(to_dt )                                          */
/* 5. 출 력 변 수 :                                                           */
/*                  월    수(mm_cnt)                                          */
/* 6. 변 경 이 력 :                                                           */
/*----------------------------------------------------------------------------*/
/* 작성자  소     속  일      자                 내      용                   */
/* ------  ---------  ----------  ------------------------------------------- */
/* 홍길동  xxxx/xxxx  2001. 1. 8  최초작성                                    */
/*@****************************************************************************/
DROP   PROCEDURE MONTHS_BETWEEN;
/*----------------------------------------------------------------------------*/
/*             P R O C E D U R E                       S T A R T              */
/*----------------------------------------------------------------------------*/
CREATE PROCEDURE MONTHS_BETWEEN(fr_dt  char(8), to_dt  char(8))

RETURNING int;
/*----------------------------------------------------------------------------*/
/* 변수 선언.                                                                 */
/*----------------------------------------------------------------------------*/
DEFINE ii        int;                                      /* Index           */
DEFINE fr_yy     int;                                      /* 시작년도        */
DEFINE fr_mm     int;                                      /* 시작월          */
DEFINE fr_dd     int;                                      /* 시작일자        */
DEFINE to_yy     int;                                      /* 종료년도        */
DEFINE to_mm     int;                                      /* 종료월          */
DEFINE to_dd     int;                                      /* 종료일자        */
DEFINE mm_cnt    int;                                      /* 월수            */
DEFINE ft_dt     char(8);                                  /* 일자(Temp)      */
/*----------------------------------------------------------------------------*/
/* 변수 초기화.                                                               */
/*----------------------------------------------------------------------------*/
LET ii     = 0;                                            /* Index           */
LET fr_yy  = 0;                                            /* 시작년도        */
LET fr_mm  = 0;                                            /* 시작월          */
LET fr_dd  = 0;                                            /* 시작일자        */
LET to_yy  = 0;                                            /* 종료년월        */
LET to_mm  = 0;                                            /* 종료월          */
LET to_dd  = 0;                                            /* 종료일자        */
LET mm_cnt = 0;                                            /* 월수            */
LET ft_dt  = '';                                           /* 일자(Temp)      */
/*----------------------------------------------------------------------------*/
/* 시작일자가 종료일자 보다 큰 경우.                                          */
/*----------------------------------------------------------------------------*/
IF ((fr_dt < '19000101') OR (to_dt < '19000101')) THEN
    RETURN mm_cnt;
END IF;
/*----------------------------------------------------------------------------*/
/* 시작일자가 종료일자 보다 큰 경우.                                          */
/*----------------------------------------------------------------------------*/
IF  fr_dt > to_dt THEN
    LET ft_dt = fr_dt;
    LET fr_dt = to_dt;
    LET to_dt = ft_dt;
END IF;
/*----------------------------------------------------------------------------*/
/* 년월일 분리.                                                               */
/*----------------------------------------------------------------------------*/
LET fr_yy = fr_dt[1,4];
LET fr_mm = fr_dt[5,6];
LET fr_dd = fr_dt[7,8];
LET to_yy = to_dt[1,4];
LET to_mm = to_dt[5,6];
LET to_dd = to_dt[7,8];
/*----------------------------------------------------------------------------*/
/* 시작년월과 종료년월이 동일한 경우.                                         */
/*----------------------------------------------------------------------------*/
IF  fr_dt[1,6] = to_dt[1,6] THEN
    IF  fr_dd >= to_dd THEN
        LET mm_cnt = 0;
    ELSE
        LET mm_cnt = 1;
    END IF;
/*----------------------------------------------------------------------------*/
/* 시작일자와 종료일자가 동일한 값이 아닌 경우.                               */
/*----------------------------------------------------------------------------*/
ELSE
    /*------------------------------------------------------------------------*/
    /* 년도 차이에 대한 월수 계산.                                            */
    /*------------------------------------------------------------------------*/
    LET mm_cnt = (to_yy - fr_yy) * 12;
    /*------------------------------------------------------------------------*/
    /* 월 차이에 대한 월수 계산.                                              */
    /*------------------------------------------------------------------------*/
    IF  to_dd >= fr_dd THEN
        LET mm_cnt = mm_cnt + (to_mm - fr_mm);
    ELSE
        LET mm_cnt = mm_cnt + (to_mm - fr_mm) - 1;
    END IF;
END IF;
/*----------------------------------------------------------------------------*/
/* 시작일자가 종료일자보다 큰 경우 음수반영.                                  */
/*----------------------------------------------------------------------------*/
IF  ft_dt > ' ' THEN
    LET mm_cnt = mm_cnt * - 1;
END IF;
/*----------------------------------------------------------------------------*/
/* 월수 Return.                                                               */
/*----------------------------------------------------------------------------*/
RETURN mm_cnt;

END    PROCEDURE;

이종일(mc529)님이 2004-12-15 15:09에 작성한 댓글입니다.

답변감사합니다.

Stored procedure 말고 자체적으로 지원되는 함수나

기타 다른방법은 없을까요?

혹시 interval 에 관련된 자세하게 설명된 자료없을까요?

이곳에서 검색해봤는데.....왠지 어렵게 설명된거 같아서요

정건호(ramer21)님이 2004-12-16 10:06에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
2098인포믹스에서 요일함수는 없나요? [1]
이미향
2004-12-28
9223
2096테이블에서 날짜별로 데이터 지우는 방법 [1]
질문
2004-12-24
8012
2094[Hiba2005]Informix SQL Editor 판매 합니다.
이호림
2004-12-22
10561
2093두날짜사이의 개월수 구하기 [2]
정건호
2004-12-14
9498
2092[질문]Informix 9.4 FC1 서버 이관관련 질문드립니다. [1]
김현수
2004-12-14
7619
2091uid_t 와같은 sys/types.h 에 선언된 타입 사용하는 방법 [1]
db러버
2004-12-14
7761
2090오라클의 spool명령과 같은 인포믹스 명령어를 찾습니다. [1]
전성현
2004-12-14
7297
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.023초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다