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 |