오라클(Oracle) SQL을 사용할 때 가장 자주 사용하는 함수 중 하나가 바로 SYSDATE입니다. 현재 날짜와 시간을 한 번에 조회할 수 있어 시스템 시간 기반의 데이터 처리가 필요한 다양한 상황에서 활용됩니다. 하지만 때로는 시간을 제외한 '날짜'만 필요할 때가 있습니다. 예를 들어, 오늘 입사한 직원만 조회하거나, 최근 며칠간의 데이터를 날짜 단위로 비교해야 할 경우 등이죠.
이럴 때 사용하면 좋은 함수가 바로 TRUNC와 TO_CHAR입니다. 이 글에서는 오라클 SYSDATE에서 날짜만 추출하는 방법 2가지를 상세하게 설명드리며, 각각의 장단점, 실무 예제까지 포함해 알려드리겠습니다.
1. 기본 : SYSDATE 함수란?
먼저 SYSDATE 함수에 대해 간단히 짚고 넘어가겠습니다.
SELECT SYSDATE FROM dual;
- 이 쿼리를 실행하면 2025-05-07 10:23:45와 같이 날짜와 시간 정보가 함께 반환됩니다.
- SYSDATE는 오라클 서버의 현재 날짜와 시간을 반환하는 내장 함수입니다.
하지만 이렇게 반환된 값에서 시간이 불필요한 경우, 아래의 두 가지 방법 중 하나를 사용해야 합니다.
2. 방법 1 : TRUNC(SYSDATE)로 시간 절삭하기
🔍 설명
TRUNC 함수는 말 그대로 **"잘라내는 함수"**입니다. 날짜에 적용하면 시간(HH24:MI:SS) 정보를 절삭하고 '날짜'만 반환합니다.
SELECT TRUNC(SYSDATE) FROM dual;
예를 들어 SYSDATE가 2025-05-07 10:23:45였다면, TRUNC(SYSDATE)는 2025-05-07 00:00:00으로 반환됩니다.
즉, 시간 정보가 0으로 초기화된 날짜만 남게 되는 것이죠.
✅ 장점
- 형식이 DATE이기 때문에 그대로 날짜 연산이나 비교가 가능합니다.
- WHERE 조건절에서 날짜 컬럼과 직접 비교할 때 매우 유용합니다.
- 인덱스를 활용한 성능 최적화에도 적합합니다.
📌 실무 예제
예제 1: 오늘 입사한 직원 조회
SELECT *
FROM emp
WHERE hiredate = TRUNC(SYSDATE);
- 위 쿼리는 hiredate가 오늘 날짜와 정확히 일치하는 데이터를 반환합니다.
예제 2: 최근 5일간 입사한 직원 조회
SELECT *
FROM emp
WHERE hiredate BETWEEN TRUNC(SYSDATE) - 5 AND SYSDATE;
- 이 경우, TRUNC(SYSDATE) - 5는 5일 전 00:00:00부터 오늘 현재 시점까지를 의미합니다.
3. 방법 2 : TO_CHAR(SYSDATE, 'YYYY-MM-DD')로 문자열 변환
🔍 설명
TO_CHAR 함수는 날짜 형식을 **문자열(String)**로 바꿔주는 함수입니다. 다양한 포맷 지정이 가능해 사용자 입맛에 맞는 출력 형태를 만들 수 있습니다.
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM dual;
결과:
2025-05-07
- 시간 정보는 아예 포함되지 않고, 순수한 문자열 형태의 날짜만 출력됩니다.
- 시각화, 로깅, 보고서 출력 등 가독성이 중요한 곳에 자주 사용됩니다.
✅ 장점
- 출력 형식을 자유롭게 지정할 수 있어 사용자 맞춤 결과가 가능합니다.
- 날짜를 문자열로 저장하거나 API 응답 등 UI 표출 용도에 적합합니다.
⚠️ 주의점
- **DATE 자료형이 아닌 문자열(String)**로 반환되기 때문에 날짜 비교 연산에 바로 사용할 수 없습니다.
- WHERE 절에서 날짜 컬럼과 비교 시 문제가 발생할 수 있어 신중하게 사용해야 합니다.
📌 실무 예제
예제 1: 날짜를 'YYYY년 MM월 DD일' 형식으로 출력
SELECT TO_CHAR(SYSDATE, 'YYYY"년 "MM"월 "DD"일"') AS today_kor
FROM dual;
결과:
2025년 05월 07일
예제 2: 날짜만 출력하는 보고서 생성
SELECT empno, ename, TO_CHAR(hiredate, 'YYYY-MM-DD') AS 입사일
FROM emp;
- 각 직원의 입사일을 깔끔한 문자열 형태로 표시합니다.
4. TRUNC vs TO_CHAR 비교 정리
항목 TRUNC(SYSDATE) TO_CHAR(SYSDATE, 'YYYY-MM-DD')
반환 타입 | DATE | VARCHAR2 (문자열) |
시간 제거 여부 | 시간 정보 제거 (00:00:00) | 시간 정보 없음 (문자열 처리) |
날짜 비교 | 가능 (DATE → DATE 비교) | 불가능하거나 별도 처리 필요 |
포맷 변경 | 불가 | 자유롭게 지정 가능 |
사용 용도 | 조건 비교, 날짜 연산 | 출력, UI 표시, 포맷 지정 필요 시 |
5. 어떤 상황에 어떤 방법을 써야 할까?
📌 TRUNC 함수가 적합한 상황
- WHERE 절에서 날짜 컬럼을 직접 비교해야 할 때
- 날짜 간의 연산이 필요한 경우 (예: 최근 7일, 특정 일자 기준 비교)
- DATE 타입 그대로 유지해야 할 때
📌 TO_CHAR 함수가 적합한 상황
- 보고서 출력, 웹 UI, 로그 등 사람이 읽는 형태로 날짜를 가공할 때
- 특정 포맷으로 날짜를 표현해야 할 때 (예: 2025/05/07 등)
- 문자열로 날짜 정보를 전달해야 하는 시스템 연동 시
6. 결론
오라클 SQL에서 SYSDATE를 사용할 때 단순히 현재 시간을 조회하는 데 그치지 않고, 어떤 목적과 용도에 따라 TRUNC와 TO_CHAR를 적절히 활용하는 것이 중요합니다. 각각의 특성과 차이를 이해하고 상황에 맞게 사용하면 더욱 정확하고 깔끔한 쿼리 작성이 가능해집니다.
- 조건 비교, 날짜 연산에는 TRUNC(SYSDATE)
- 보고서 출력, 포맷 지정에는 TO_CHAR(SYSDATE, 'YYYY-MM-DD')
이 두 가지 방식은 실무에서 매우 자주 쓰이는 패턴이므로 반드시 숙지해두시길 바랍니다.
🔔 오늘의 팁:
TRUNC(SYSDATE)는 인덱스를 타는 경우가 많아 성능상 유리합니다. 반면, TO_CHAR는 문자열로 바뀌는 순간 인덱스를 사용할 수 없으므로, WHERE 조건에서는 사용을 자제하고, SELECT 절에서만 사용하는 것이 바람직합니다.
'정보' 카테고리의 다른 글
[Oracle SQL] 날짜(Date)에서 시간만 추출하는 2가지 방법: TO_CHAR vs EXTRACT 완벽 정리 (0) | 2025.05.07 |
---|---|
[Oracle SQL 꿀팁] 오라클에서 근삿값(근사치)을 찾는 2가지 핵심 방법: ROW_NUMBER와 RANK 함수 완벽 비교 (0) | 2025.05.07 |
[Oracle JSON 함수 정복] JSON_ARRAYAGG 함수 완벽 가이드 | 여러 행을 JSON 배열로 묶기 (0) | 2025.05.07 |
오라클 JSON_OBJECT 함수 완벽 가이드: 기본 문법부터 고급 옵션까지 (0) | 2025.05.07 |
오라클 JSON_OBJECTAGG 함수 완전 정복 – JSON 객체로 데이터를 변환하는 실전 예제 총정리 (0) | 2025.05.07 |