1. DB2 기본 날짜 함수

DB2에서 날짜와 시간을 다루는 기본 함수들부터 알아봅시다.

현재 날짜 및 시간 구하기

-- 현재 날짜 가져오기
SELECT CURRENT DATE FROM SYSIBM.SYSDUMMY1;  -- 2025-03-19

-- 현재 시간 가져오기
SELECT CURRENT TIME FROM SYSIBM.SYSDUMMY1;  -- 14:30:25

-- 현재 타임스탬프(날짜+시간) 가져오기
SELECT CURRENT TIMESTAMP FROM SYSIBM.SYSDUMMY1;  -- 2025-03-19-14.30.25.123456

-- 대체 표현 방식
SELECT CURRENT_DATE FROM SYSIBM.SYSDUMMY1;  -- 2025-03-19
SELECT CURRENT_TIME FROM SYSIBM.SYSDUMMY1;  -- 14:30:25
SELECT CURRENT_TIMESTAMP FROM SYSIBM.SYSDUMMY1;  -- 2025-03-19-14.30.25.123456

활용 팁: DB2에서는 SYSIBM.SYSDUMMY1이라는 특수 테이블을 사용하여 시스템 값을 조회합니다. 이는 Oracle의 DUAL이나 MS-SQL의 단독 SELECT와 유사한 역할을 합니다.

다양한 타임스탬프 함수

-- 현재 타임스탬프 (마이크로초 포함)
SELECT CURRENT TIMESTAMP FROM SYSIBM.SYSDUMMY1;  -- 2025-03-19-14.30.25.123456

-- 정밀도 지정 타임스탬프 (0~12 범위)
SELECT CURRENT TIMESTAMP(6) FROM SYSIBM.SYSDUMMY1;  -- 2025-03-19-14.30.25.123456 (6자리 마이크로초)
SELECT CURRENT TIMESTAMP(0) FROM SYSIBM.SYSDUMMY1;  -- 2025-03-19-14.30.25 (초 단위까지)

정밀도 활용: 로그 기록이나 성능 측정과 같이 정밀한 시간 기록이 필요한 경우 높은 정밀도를, 일반적인 날짜 기록에는 낮은 정밀도를 사용하는 것이 좋습니다.

 

2. DB2 날짜 추출 및 변환

날짜 구성 요소 추출하기

-- 연, 월, 일 추출
SELECT 
    YEAR(CURRENT DATE) AS "연도",       -- 2025
    MONTH(CURRENT DATE) AS "월",        -- 3
    DAY(CURRENT DATE) AS "일"           -- 19
FROM SYSIBM.SYSDUMMY1;

-- 시간 요소 추출
SELECT 
    HOUR(CURRENT TIME) AS "시",         -- 14
    MINUTE(CURRENT TIME) AS "분",       -- 30
    SECOND(CURRENT TIME) AS "초"        -- 25
FROM SYSIBM.SYSDUMMY1;

-- 타임스탬프에서 추출
SELECT 
    MICROSECOND(CURRENT TIMESTAMP) AS "마이크로초"  -- 123456
FROM SYSIBM.SYSDUMMY1;

실무 활용: 날짜의 특정 부분으로 그룹화하거나 필터링할 때 유용합니다. 월별 리포트, 연도별 통계 등을 작성할 때 자주 사용됩니다.

요일 및 주차 정보 추출

-- 요일 정보 가져오기 (1=일요일, 7=토요일)
SELECT 
    DAYOFWEEK(CURRENT DATE) AS "요일숫자",      -- 4 (수요일)
    DAYOFWEEK_ISO(CURRENT DATE) AS "ISO요일",  -- 3 (ISO 표준: 1=월요일, 7=일요일)
    DAYNAME(CURRENT DATE) AS "요일이름"         -- Wednesday
FROM SYSIBM.SYSDUMMY1;

-- 주차 및 연중 일수 정보
SELECT 
    WEEK(CURRENT DATE) AS "연중주차",           -- 12
    WEEK_ISO(CURRENT DATE) AS "ISO주차",        -- 12
    DAYOFYEAR(CURRENT DATE) AS "연중일수",      -- 78
    QUARTER(CURRENT DATE) AS "분기"             -- 1
FROM SYSIBM.SYSDUMMY1;

국제 표준: DB2는 일반적인 주차(WEEK)와 ISO 표준 주차(WEEK_ISO)를 모두 제공합니다. 국제적인 시스템에서는 ISO 표준을 사용하는 것이 권장됩니다.

문자열을 날짜로 변환하기

-- 문자열을 날짜로 변환
SELECT DATE('2025-03-19') FROM SYSIBM.SYSDUMMY1;  -- 2025-03-19

-- 문자열을 시간으로 변환
SELECT TIME('14:30:25') FROM SYSIBM.SYSDUMMY1;  -- 14:30:25

-- 문자열을 타임스탬프로 변환
SELECT TIMESTAMP('2025-03-19 14:30:25') FROM SYSIBM.SYSDUMMY1;  -- 2025-03-19-14.30.25.000000

-- 다양한 형식의 문자열을 날짜로 변환 (TO_DATE)
SELECT 
    TO_DATE('19/03/2025', 'DD/MM/YYYY') AS "영국식날짜",
    TO_DATE('03/19/2025', 'MM/DD/YYYY') AS "미국식날짜",
    TO_DATE('2025년 3월 19일', 'YYYY년 M월 D일') AS "한글날짜"
FROM SYSIBM.SYSDUMMY1;

활용 사례: 사용자 입력이나 외부 시스템에서 받은 문자열 데이터를 DB2 날짜 타입으로 변환할 때 유용합니다.

 

3. DB2 날짜 연산

날짜 더하기/빼기

-- 날짜에 일수 더하기/빼기
SELECT 
    CURRENT DATE AS "오늘",
    CURRENT DATE + 1 DAY AS "내일",                -- 2025-03-20
    CURRENT DATE - 1 DAY AS "어제",                -- 2025-03-18
    CURRENT DATE + 7 DAYS AS "일주일후",           -- 2025-03-26
    CURRENT DATE - 7 DAYS AS "일주일전"            -- 2025-03-12
FROM SYSIBM.SYSDUMMY1;

-- 다양한 단위 더하기/빼기
SELECT 
    CURRENT DATE + 1 MONTH AS "한달후",            -- 2025-04-19
    CURRENT DATE - 1 MONTH AS "한달전",            -- 2025-02-19
    CURRENT DATE + 1 YEAR AS "일년후",             -- 2026-03-19
    CURRENT DATE + 3 YEARS + 6 MONTHS AS "3년6개월후"  -- 2028-09-19
FROM SYSIBM.SYSDUMMY1;

실무 활용: 만료일 계산(30일 후), 결제 예정일(다음 달), 프로모션 기간(7일 후까지) 등 다양한 업무에 활용될 수 있습니다.

날짜 간 차이 계산

-- 두 날짜 간의 일수 차이
SELECT 
    DAYS(DATE '2025-12-31') - DAYS(CURRENT DATE) AS "남은일수"   -- 287 (예시)
FROM SYSIBM.SYSDUMMY1;

-- 다양한 단위로 차이 계산 (TIMESTAMPDIFF)
SELECT 
    TIMESTAMPDIFF(16, CHAR(TIMESTAMP('1990-05-15-00.00.00') - TIMESTAMP(CURRENT TIMESTAMP))) AS "만나이"  -- 34
FROM SYSIBM.SYSDUMMY1;

-- 두 타임스탬프 간의 초 단위 차이
SELECT 
    TIMESTAMPDIFF(2, CHAR(TIMESTAMP('2025-03-19-17.30.00') - TIMESTAMP('2025-03-19-09.00.00'))) AS "근무시간(초)"  -- 30600
FROM SYSIBM.SYSDUMMY1;

TIMESTAMPDIFF 코드: DB2의 TIMESTAMPDIFF는 특이한 코드 값을 사용합니다. 1=마이크로초, 2=초, 4=분, 8=시, 16=일, 32=주, 64=월, 128=분기, 256=년

나이 계산하기

-- 생년월일로 정확한 나이 계산
SELECT 
    TIMESTAMPDIFF(256, CHAR(TIMESTAMP(CURRENT TIMESTAMP) - TIMESTAMP('1990-05-15-00.00.00'))) AS "만나이"  -- 34
FROM SYSIBM.SYSDUMMY1;

-- 생일 지남 여부를 고려한 정확한 나이 계산
SELECT 
    (YEAR(CURRENT DATE) - YEAR(DATE '1990-05-15')) - 
    CASE 
        WHEN (MONTH(CURRENT DATE) < MONTH(DATE '1990-05-15')) OR 
             (MONTH(CURRENT DATE) = MONTH(DATE '1990-05-15') AND DAY(CURRENT DATE) < DAY(DATE '1990-05-15')) 
        THEN 1 
        ELSE 0 
    END AS "정확한만나이"  -- 생일 지남 여부에 따라 34 또는 33
FROM SYSIBM.SYSDUMMY1;

한국식 나이: 한국식 나이(세는 나이)는 위 계산결과에 1을 더하면 됩니다.

 

4. DB2 날짜 형식 지정

TO_CHAR로 날짜 형식 지정

-- 다양한 날짜 형식
SELECT 
    TO_CHAR(CURRENT DATE, 'YYYY-MM-DD') AS "ISO형식",          -- 2025-03-19
    TO_CHAR(CURRENT DATE, 'DD/MM/YYYY') AS "영국식",           -- 19/03/2025
    TO_CHAR(CURRENT DATE, 'MM/DD/YYYY') AS "미국식",           -- 03/19/2025
    TO_CHAR(CURRENT DATE, 'YYYY년 MM월 DD일') AS "한글식",     -- 2025년 03월 19일
    TO_CHAR(CURRENT TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS') AS "ISO날짜시간"  -- 2025-03-19 14:30:25
FROM SYSIBM.SYSDUMMY1;

활용 사례: 리포트, 화면 출력, 데이터 내보내기 등에서 원하는 형식으로 날짜를 표시할 때 사용됩니다.

자주 사용되는 날짜 형식 코드

-- 날짜 형식 코드 예제
SELECT 
    TO_CHAR(CURRENT DATE, 'YYYY') AS "4자리연도",       -- 2025
    TO_CHAR(CURRENT DATE, 'YY') AS "2자리연도",         -- 25
    TO_CHAR(CURRENT DATE, 'MM') AS "월숫자",            -- 03
    TO_CHAR(CURRENT DATE, 'MON') AS "월약자",           -- MAR
    TO_CHAR(CURRENT DATE, 'MONTH') AS "월이름",         -- MARCH
    TO_CHAR(CURRENT DATE, 'DD') AS "일",                -- 19
    TO_CHAR(CURRENT DATE, 'DY') AS "요일약자",          -- WED
    TO_CHAR(CURRENT DATE, 'DAY') AS "요일이름"          -- WEDNESDAY
FROM SYSIBM.SYSDUMMY1;

-- 시간 형식 코드 예제
SELECT 
    TO_CHAR(CURRENT TIME, 'HH24') AS "24시간",          -- 14
    TO_CHAR(CURRENT TIME, 'HH') AS "12시간",            -- 02
    TO_CHAR(CURRENT TIME, 'MI') AS "분",                -- 30
    TO_CHAR(CURRENT TIME, 'SS') AS "초",                -- 25
    TO_CHAR(CURRENT TIME, 'AM') AS "오전/오후",         -- PM
    TO_CHAR(CURRENT TIME, 'HH:MI:SS AM') AS "시간"      -- 02:30:25 PM
FROM SYSIBM.SYSDUMMY1;

알아두세요: DB2의 TO_CHAR 함수는 Oracle과 유사한 형식 코드를 사용합니다. DB2 9.7 이상 버전부터 지원됩니다.

 

5. DB2 날짜 범위 다루기

월의 첫날/마지막날 구하기

-- 해당 월의 첫날
SELECT 
    DATE(YEAR(CURRENT DATE) || '-' || MONTH(CURRENT DATE) || '-01') AS "월의첫날"  -- 2025-03-01
FROM SYSIBM.SYSDUMMY1;

-- 해당 월의 마지막날
SELECT 
    LAST_DAY(CURRENT DATE) AS "월의마지막날"  -- 2025-03-31
FROM SYSIBM.SYSDUMMY1;

-- 다음 달의 첫날
SELECT 
    DATE(YEAR(CURRENT DATE) || '-' || MONTH(CURRENT DATE) || '-01') + 1 MONTH AS "다음달첫날"  -- 2025-04-01
FROM SYSIBM.SYSDUMMY1;

-- 이전 달의 마지막날
SELECT 
    DATE(YEAR(CURRENT DATE) || '-' || MONTH(CURRENT DATE) || '-01') - 1 DAY AS "이전달마지막날"  -- 2025-02-28
FROM SYSIBM.SYSDUMMY1;

실무 활용: 월별 보고서 기간 설정, 월 단위 결제 주기 계산 등에 활용됩니다.

연도 및 분기의 시작/끝 구하기

-- 해당 연도의 첫날/마지막날
SELECT 
    DATE(YEAR(CURRENT DATE) || '-01-01') AS "연도첫날",                -- 2025-01-01
    DATE(YEAR(CURRENT DATE) || '-12-31') AS "연도마지막날"             -- 2025-12-31
FROM SYSIBM.SYSDUMMY1;

-- 해당 분기의 첫날
SELECT 
    DATE(YEAR(CURRENT DATE) || '-' || 
        CASE QUARTER(CURRENT DATE)
            WHEN 1 THEN '01'
            WHEN 2 THEN '04'
            WHEN 3 THEN '07'
            WHEN 4 THEN '10'
        END || '-01') AS "분기첫날"  -- 2025-01-01 (1분기)
FROM SYSIBM.SYSDUMMY1;

-- 해당 분기의 마지막날
SELECT 
    LAST_DAY(DATE(YEAR(CURRENT DATE) || '-' || 
        CASE QUARTER(CURRENT DATE)
            WHEN 1 THEN '03'
            WHEN 2 THEN '06'
            WHEN 3 THEN '09'
            WHEN 4 THEN '12'
        END || '-01')) AS "분기마지막날"  -- 2025-03-31 (1분기)
FROM SYSIBM.SYSDUMMY1;

분기별 계산: 회계 보고서나 분기별 목표 달성 보고서 작성 시 유용합니다.

일주일의 시작/끝 구하기

-- 현재 주의 월요일(한 주의 시작 - ISO 표준)
SELECT 
    CURRENT DATE - (DAYOFWEEK_ISO(CURRENT DATE) - 1) DAYS AS "이번주월요일"  -- 2025-03-17 (월요일)
FROM SYSIBM.SYSDUMMY1;

-- 현재 주의 일요일(한 주의 끝 - ISO 표준)
SELECT 
    CURRENT DATE + (7 - DAYOFWEEK_ISO(CURRENT DATE)) DAYS AS "이번주일요일"  -- 2025-03-23 (일요일)
FROM SYSIBM.SYSDUMMY1;

주별 보고서: 주간 매출 보고서나 주간 활동 요약 작성 시 활용할 수 있습니다.

 

6. DB2 실무 사례: 자주 사용되는 쿼리

오늘/어제/이번주/이번달 데이터 조회

-- 오늘 데이터 조회
SELECT * FROM orders
WHERE DATE(order_date) = CURRENT DATE;

-- 어제 데이터 조회
SELECT * FROM orders
WHERE DATE(order_date) = CURRENT DATE - 1 DAY;

-- 이번 달 데이터 조회
SELECT * FROM orders
WHERE YEAR(order_date) = YEAR(CURRENT DATE) 
  AND MONTH(order_date) = MONTH(CURRENT DATE);

-- 지난 7일간 데이터 조회
SELECT * FROM orders
WHERE order_date >= CURRENT DATE - 7 DAYS;

: DATE() 함수를 사용하여 시간 부분을 제거하면 날짜 비교가 더 정확해집니다.

일별 트렌드 분석 (간결한 버전)

-- 최근 7일간 일별 주문 집계
SELECT 
    DATE(order_date) AS order_day,
    COUNT(*) AS order_count,
    SUM(total_amount) AS daily_sales
FROM 
    orders
WHERE 
    order_date >= CURRENT DATE - 7 DAYS
GROUP BY 
    DATE(order_date)
ORDER BY 
    order_day;

: 이 쿼리로 요일별 주문 패턴을 파악할 수 있습니다. 주말에 주문이 늘어나는지, 특정 요일에 매출이 집중되는지 확인 가능합니다.

월별 매출 비교 (작년 vs 올해)

-- 월별 매출 비교 (작년 vs 올해)
SELECT 
    MONTH(order_date) AS order_month,
    SUM(CASE WHEN YEAR(order_date) = YEAR(CURRENT DATE) - 1 
        THEN total_amount ELSE 0 END) AS last_year_sales,
    SUM(CASE WHEN YEAR(order_date) = YEAR(CURRENT DATE) 
        THEN total_amount ELSE 0 END) AS this_year_sales
FROM 
    orders
WHERE 
    order_date >= DATE(CHAR(YEAR(CURRENT DATE) - 1) || '-01-01')
GROUP BY 
    MONTH(order_date)
ORDER BY 
    order_month;

성장률 분석: 이 쿼리로 작년 대비 올해 매출 성장을 쉽게 비교할 수 있습니다.

 

7. DB2 시간 관련 함수

DB2에서 시간을 다루는 방법을 알아봅시다.

시간 데이터 다루기

-- 현재 시간 가져오기
SELECT CURRENT TIME FROM SYSIBM.SYSDUMMY1;  -- 14:30:25

-- 시간 구성요소 추출
SELECT 
    HOUR(CURRENT TIME) AS "시",      -- 14
    MINUTE(CURRENT TIME) AS "분",    -- 30
    SECOND(CURRENT TIME) AS "초"     -- 25
FROM SYSIBM.SYSDUMMY1;

-- 24시간을 초로 변환
SELECT 24 * 60 * 60 AS "하루초" FROM SYSIBM.SYSDUMMY1;  -- 86400

활용 팁: DB2에서는 TIME 데이터 타입을 사용하여 시간 정보를 저장하고 처리합니다.

시간 계산

-- 시간 더하기/빼기
SELECT 
    CURRENT TIME AS "현재",                              -- 14:30:25
    CURRENT TIME + 1 HOUR AS "1시간후",                  -- 15:30:25
    CURRENT TIME - 1 HOUR AS "1시간전",                  -- 13:30:25
    CURRENT TIME + 30 MINUTES AS "30분후",               -- 15:00:25
    CURRENT TIME + 30 MINUTES + 10 SECONDS AS "30분10초후"  -- 15:00:35
FROM SYSIBM.SYSDUMMY1;

업무 활용: 근무 시간 계산, 작업 소요 시간 측정 등에 활용할 수 있습니다.

실무 사례: 시간 활용

-- 시간대별 주문 분석
SELECT 
    HOUR(order_time) AS hour_of_day,
    HOUR(order_time) || ':00-' || (HOUR(order_time) + 1) || ':00' AS time_slot,
    COUNT(*) AS order_count
FROM 
    orders
WHERE 
    DATE(order_date) = CURRENT DATE  -- 오늘 주문만
GROUP BY 
    HOUR(order_time)
ORDER BY 
    hour_of_day;

: 이 쿼리로 하루 중 주문이 가장 많은 시간대를 파악할 수 있습니다.

 

8. DB2 날짜 관련 문제 해결

날짜 비교 주의사항

-- 시간 부분 포함된 날짜 비교 시 주의
SELECT 
    CASE 
        WHEN TIMESTAMP('2025-03-19 15:30:00') = DATE '2025-03-19' 
        THEN '일치' 
        ELSE '불일치' 
    END AS result
FROM SYSIBM.SYSDUMMY1;  -- '불일치' 반환 (시간 부분이 다름)

-- 올바른 방식 (날짜 부분만 비교)
SELECT 
    CASE 
        WHEN DATE(TIMESTAMP('2025-03-19 15:30:00')) = DATE '2025-03-19' 
        THEN '일치' 
        ELSE '불일치' 
    END AS result
FROM SYSIBM.SYSDUMMY1;  -- '일치' 반환

흔한 실수: 시간이 포함된 TIMESTAMP와 날짜만 있는 DATE를 비교할 때 발생하는 가장 흔한 오류입니다. DATE() 함수를 사용하여 시간 부분을 제거한 후 비교하세요.

월말 처리 문제

-- 월말 날짜 이슈
SELECT 
    DATE '2025-01-31' AS "1월말",
    DATE '2025-01-31' + 1 MONTH AS "1개월후"  -- 2025-02-28 (2월은 28일까지)
FROM SYSIBM.SYSDUMMY1;

-- LAST_DAY 함수 활용
SELECT 
    LAST_DAY(DATE '2025-01-31') AS "1월마지막날",  -- 2025-01-31
    LAST_DAY(DATE '2025-02-01') AS "2월마지막날"   -- 2025-02-28
FROM SYSIBM.SYSDUMMY1;

날짜 계산 주의: 월마다 일수가 다르기 때문에 월 단위 계산 시 예상과 다른 결과가 나올 수 있습니다. 특히 월말 결제일 계산 시 LAST_DAY 함수를 활용하세요.

윤년 처리

-- 윤년 여부 확인
CREATE FUNCTION is_leap_year(p_year INTEGER)
RETURNS CHAR(1)
BEGIN
    DECLARE v_result CHAR(1);
    
    IF (MOD(p_year, 400) = 0) OR (MOD(p_year, 4) = 0 AND MOD(p_year, 100) <> 0) THEN
        SET v_result = 'Y';
    ELSE
        SET v_result = 'N';
    END IF;
    
    RETURN v_result;
END;

-- 사용 예
SELECT 
    is_leap_year(2024) AS "2024년",  -- Y (윤년)
    is_leap_year(2025) AS "2025년"   -- N (평년)
FROM SYSIBM.SYSDUMMY1;

-- 2월 마지막 날 확인으로 윤년 확인
SELECT 
    DAY(LAST_DAY(DATE('2024-02-01'))) AS "2024년2월마지막날",  -- 29
    DAY(LAST_DAY(DATE('2025-02-01'))) AS "2025년2월마지막날"   -- 28
FROM SYSIBM.SYSDUMMY1;

특정 날짜 유효성 검사: 사용자 입력 날짜의 유효성을 검사할 때 윤년 여부를 확인해야 합니다. LAST_DAY 함수를 사용하면 쉽게 확인할 수 있습니다.


 

이 글에서는 IBM DB2의 날짜 및 시간 함수에 대해 알아보았습니다. DB2는 대규모 엔터프라이즈 환경에서 많이 사용되는 데이터베이스로, 금융, 보험, 공공기관 등의 중요 시스템에서 많이 사용되며, 특히 날짜와 시간을 정확하게 처리하는 것은 무엇보다 중요합니다. 특히 금융 거래, 보험 만기일 계산, 납기일 관리 등에서 날짜 함수의 정확한 활용은 시스템의 신뢰성과 직결되기 때문입니다. DB2에서 특히 CURRENT DATE, CURRENT TIME, CURRENT TIMESTAMP, DATE, TIME, TIMESTAMP, DAYS, LAST_DAY, TO_CHAR, TO_DATE 등의 함수는 날짜 작업 시 가장 많이 사용되는 핵심 함수들이니, 만약 DB2를 사용하신다면 꼭 익숙해질 필요가 있습니다.

 

댓글 남기기