251021 TIL
2025. 10. 21. 17:51ㆍCourses/아이티윌 오라클 DBA 과정
오라클 버전별 접미사
i(8i, 9i) : Internet / 인터넷 환경, 웹 애플리케이션 지원을 강조
g(10g, 11g) : Grid / 그리드(분산처리, 클러스터) 환경 지원을 강조
c(12c, 19c) : Cloud / 클라우드 환경 및 컨테이너/서비스 형태 지원을 강조
ai(23ai, 26ai) : Artificial Intelligence / AI/벡터 검색, 자연어처리, 생성형 AI 지원을 강조
날짜
날짜 함수
SELECT
sysdate,
systimestamp,
current_date,
current_timestamp,
localtimestamp
FROM dual;

- 서버 시간
- sysdate : 현재 서버 날짜를 리턴하는 함수
- systimestamp : 현재 서버 날짜, 시간, 타임존을 리턴하는 함수
- 세션 시간
- current_date : 현재 클라이언트의 날짜를 리턴하는 함수
- current_timestamp : 현재 클라이언트의 날짜, 시간, 타임존을 리턴하는 함수
- localtimestamp : 현재 클라이언트의 날짜, 시간을 리턴하는 함수
-- 세션 타임존 수정
ALTER SESSION SET TIME_ZONE = '-05:00';
SELECT
sysdate,
systimestamp,
current_date,
current_timestamp,
localtimestamp
FROM dual;

날짜 계산
- 날짜 + 숫자(일수) = 날짜
- 날짜 - 숫자(일수) = 날짜
- 날짜 - 날짜 = 일수(숫자)
- 날짜 + 날짜 = 오류
- 날짜 + 시간 = 날짜 시간
- 날 짜 - 시간 = 날짜 시간
SELECT
sysdate + 100,
sysdate - 100
FROM dual;

SELECT
employee_id,
hire_date,
TRUNC(sysdate - hire_date)
FROM hr.employees;

SELECT sysdate + sysdate
FROM dual;

SELECT
systimestamp,
TO_CHAR(systimestamp + 10/24, 'yyyy-mm-dd hh24:mi:ss'),
TO_CHAR(localtimestamp + 10/24, 'yyyy-mm-dd hh24:mi:ss'),
TO_CHAR(current_timestamp + 10/24, 'yyyy-mm-dd hh24:mi:ss')
FROM dual;

- 10/24 : 10시간
- 100/(24*60) : 100분
- 100 / (24_60_60) : 100초
months_between
- 두 날짜 감의 달 수(개월 수)를 리턴하는 함수
SELECT
employee_id,
hire_date,
TRUNC(sysdate - hire_date) 근무일수,
TRUNC(months_between(sysdate, hire_date)) 근무개월수
FROM hr.employees;

add_months
- 달 수를 더하거나 빼는 함수
SELECT
sysdate,
add_months(sysdate, 5),
add_months(sysdate, -5)
FROM dual;

next_day
- 입력한 날짜를 기준으로 찾고자 하는 요일의 첫 번째 날짜를 반환하는 함수
- 현재 세션 언어에 따라 요일 이름을 맞춰서 작성해야 함(nls_session_parmeters 참고)
SELECT
sysdate,
next_day(sysdate, '금요일')
FROM dual;

last_day
- 기준 날짜 달에서 마지막 날짜를 리턴하는 함수
SELECT
sysdate,
last_day(sysdate),
last_day(add_months(sysdate, 1))
FROM dual;

trunc
- trunc(date, ‘형식모델’)
- 날짜의 시간 부분을 형식 모델에 지정된 단위로 잘라서 반환
SELECT
systimestamp,
trunc(systimestamp, 'month'), -- 달의 시작일
trunc(systimestamp, 'year'), -- 년의 시작일
TO_CHAR(trunc(systimestamp), 'yy/mm/dd hh24:mi:ss.sssss') -- 그 날의 자정
FROM dual;

round
- round(date, ‘형식모델’)
- 형식모델에서 지정된 단위로 반올림하여 반환
- month : 날짜 1 ~ 15일은 현재 월의 시작일, 16~ 31일은 다음 월의 시작일
- year : 1 ~ 6월은 현재 연도의 1월 1일, 7 ~ 12월은 다음 연도의 1월 1일
- 형식 모델을 사용하지 않으면 가장 가까운 날짜로 반올림
SELECT
systimestamp,
round(systimestamp, 'month'),
round(systimestamp, 'year'),
round(systimestamp)
FROM dual;

문제
-- [문제18] 20년 이상 근무한 사원들의 사원번호(employee_id), 입사날짜(hire_date), 근무개월수를 조회하세요.
SELECT employee_id 사원번호, hire_date 입사날짜, trunc(months_between(sysdate, hire_date)) 근무개월수
FROM hr.employees
WHERE months_between(sysdate, hire_date) >= 240;
-- [문제19] 사원의 last_name,hire_date 및 근무 6 개월 후 월요일에 해당하는 날짜를 조회하세요. 열별칭은 REVIEW 로 지정합니다.
SELECT last_name, hire_date, next_day(add_months(hire_date, 6), '월요일') review
FROM hr.employees;
형 변환 함수
to_char(날짜, ‘날짜 형식 모델 요소’)
- date 형을 char 형으로 변환하는 함수
SELECT
sysdate,
to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss.sssss'),
to_char(sysdate, 'yy yyyy rr rrrr year') 년,
to_char(sysdate, 'mm mon month') 월,
to_char(sysdate, 'dd ddd') 일,
to_char(sysdate, 'hh hh12 hh24') 시,
to_char(sysdate, 'mi ss sssss') 분초밀리초,
to_char(sysdate, 'day dy d') 요일,
to_char(sysdate, 'ww w') 주,
to_char(sysdate, 'q"분기"') 분기,
to_char(sysdate, 'ddsp ddth ddthsp') 문자일
FROM dual;

날짜 형식 모델 요소
- yy : 연도 2자리
- yyyy : 연도 4자리
- rr : 연도 2자리
- rrrr : 연도 4자리
- year : 문자 연도
- mm : 숫자달
- mon : 달(월) 이름 약어
- month : 달(월) 이름
- dd : 달의 일수
- ddd : 년의 일수
- hh / hh12 : 12시간으로 환산한 시간
- hh24 : 24시간으로 환산한 시간
- mi : 분
- ss : 초
- sssss : 초 이하 자리수(5자리)
- day : 요일
- dy : 요일 약어
- d : 숫자 요일(일(1) ~ 토(7))
- ww : 일년 중의 주
- w : 그 달의 주
- q : 분기
- ddsp : 문자일
- ddth : 서수단위 일
- ddthsp : 서수단위 문자일
문제
-- [문제20] 사원들의 사원번호, 입사한 요일을 출력하세요. 단 요일을 오름차순 정렬해주세요.
SELECT employee_id 사원번호, to_char(hire_date, 'day') 입사요일
FROM hr.employees
ORDER BY to_char(hire_date, 'd');
-- 월요일부터 정렬
SELECT employee_id 사원번호, to_char(hire_date, 'day') 입사요일
FROM hr.employees
ORDER BY to_char(hire_date-1, 'd');
to_char(숫자, ‘숫자모델요소’)
- number 형을 char 형으로 변환하는 함수
- 오버로딩(overloading) : 함수 이름은 같고 매개변수의 타입과 갯수가 다르도록 하는 기능, 객체지향프로그램의 기능
SELECT
salary,
to_char(salary, '$999,999.00'),
to_char(salary, '$000,999.00'),
to_char(salary, 'L999G999D00')
FROM hr.employees;

SELECT
100,
-100,
to_char(-100, '999mi'),
to_char(-100, '999pr'),
to_char(100, 's999')
FROM dual;

숫자 모델 요소
- 9 : 숫자를 나타냄, 이 위치에 숫자값이 없으면 출력되지는 않음
- 0 : 숫자를 나타냄, 이 위치에 숫자값이 없으면 0으로 출력됨
- $ : 달러 기호
- , : 1000단위 구분자
- . : 소수점 구분자
- G : 천 단위 구분자(지역에 맞게)
- D : 소수점 구분자(지역에 맞게)
- L : 로컬 통화 기호(지역에 맞게)
- mi : 오른쪽 음수 부호
- pr : 음수일 경우 꺽쇠(<>)로 묶음
- s : 음수, 양수 부호를 표시
ALTER SESSION SET NLS_LANGUAGE = american; -- 한국 : korean, 일본 : japanese, 중국 : 'simplified chinese', 프랑스 : french
ALTER SESSION SET NLS_TERRITORY = america; -- 한국 : korea, 일본 : japan, 중국 : china, 프랑스 : france
SELECT
employee_id,
salary,
hire_date,
to_char(hire_date, 'day month mon'),
to_char(salary, 'L999G999D00')
FROM hr.employees;




문제
-- [문제21] 2006년도에 홀수달에 입사한 사원들의 정보를 출력해주세요.
SELECT *
FROM hr.employees
WHERE hire_date BETWEEN TO_DATE('20060101', 'yyyymmdd') AND TO_DATE('20070101', 'yyyymmdd') - 1/24/60/60
AND mod(to_number(to_char(hire_date, 'mm')), 2) = 1;
- mod()는 숫자 함수라 문자형이 들어오더라도 자동 형 변환이 일어나지만 수동으로 형 변환하는 습관을 들이는 것이 좋음
to_number(문자숫자, [’숫자모델요소’])
- 문자 숫자를 숫자형(number)으로 변환하는 함수
SELECT
'1' + 2, -- 암시적 형 변환
to_number('1', '9') + 2, -- 명시적 형 변환
to_number('1') + 2
FROM dual;

YY vs RR
95-10-27
1995-10-25
2095-10-25
- YY : 현재 년도의 세기를 반영, 2095-10-27
- RR : 2000년도부터는 표기법을 자동화로 변경
RR 표기법
| 데이터 입력 연도 0 ~ 49 | 데이터 입력 연도 50 ~ 99 | |
|---|---|---|
| 현재연도 0 ~ 49 | 반환 날짜는 현재 세기를 반영 | 반환 날짜는 이전 세기를 반영 |
| 현재연도 50 ~ 99 | 반환 날짜는 이후 세기를 반영 | 반환 날짜는 현재 세기를 반영 |
| 현재연도 | 데이터 입력 날짜 | YY | RR |
|---|---|---|---|
| 1994 | 95-10-27 | 1995 | 1995 |
| 1994 | 17-10-27 | 1917 | 2017 |
| 2001 | 17-10-27 | 2017 | 2017 |
| 2048 | 52-10-27 | 2052 | 1952 |
| 2051 | 47-10-27 | 2047 | 2147 |
SELECT
to_char(to_date('95-10-27', 'yy-mm-dd'), 'yyyy-mm-dd'),
to_char(to_date('95-10-27', 'rr-mm-dd'), 'yyyy-mm-dd')
FROM dual;

Null 관련 함수
nvl
- null 값을 실제 값으로 대체하는 함수
SELECT
employee_id,
salary,
commission_pct,
salary * 12 + salary * 12 * commission_pct ann_sal_1,
salary * 12 + salary * 12 * nvl(commission_pct, 0) ann_sal_2
FROM hr.employees;

SELECT
employee_id,
salary,
commission_pct,
nvl(commission_pct, 0),
nvl(to_char(commission_pct), 'no comm')
FROM hr.employees;

- nvl 함수의 인자의 자료형이 서로 같아야 함
- 같지 않으면 오류 발생

nvl2(exp1, exp2, exp3)
- 첫 번째 exp1이 null이 아니면 exp2를 수행하고, 첫 번째 exp1이 null 이면 exp3 수행
SELECT
employee_id,
salary,
commission_pct,
salary * 12 + salary * 12 * commission_pct ann_sal_1,
salary * 12 + salary * 12 * nvl(commission_pct, 0) ann_sal_2,
nvl2(commission_pct, salary * 12 + salary * 12 * commission_pct, salary * 12) ann_sal3
FROM hr.employees;

- exp2와 exp3의 자료형이 같아야 함
SELECT
employee_id,
salary,
commission_pct,
nvl(commission_pct, 0),
nvl(to_char(commission_pct), 'no comm'),
nvl2(commission_pct, to_char(salary*12), 'no comm')
FROM hr.employees;

coalesce(exp1, exp2, exp3, …)
- 첫 번째 exp1이 null이면 exp2를 수행하고 exp2도 null이면 exp3 수행 ….
- null이 발생하지 않을 때까지 인수(표현식)을 수행하는 함수
- 모든 인수의 자료형이 일치해야 함
SELECT
employee_id,
salary,
commission_pct,
salary * 12 + salary * 12 * commission_pct ann_sal_1,
salary * 12 + salary * 12 * nvl(commission_pct, 0) ann_sal_2,
nvl2(commission_pct, salary * 12 + salary * 12 * commission_pct, salary * 12) ann_sal3,
coalesce(salary * 12 + salary * 12 * commission_pct, salary * 12, 0) ann_sal4
-- coalesce(salary * 12 + salary * 12 * commission_pct, 'no comm', 0) 오류
FROM hr.employees;

'Courses > 아이티윌 오라클 DBA 과정' 카테고리의 다른 글
| 251023 TIL (0) | 2025.10.23 |
|---|---|
| 251022 TIL (0) | 2025.10.22 |
| 251020 TIL (0) | 2025.10.20 |
| 251017 TIL (0) | 2025.10.17 |
| 251016 TIL (0) | 2025.10.16 |