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를 사용하신다면 꼭 익숙해질 필요가 있습니다.