연산 | 설명 |
---|---|
날짜 데이터 + 숫자 | 날짜 데이터보다 숫자만큼 일수 이후의 날짜 |
날짜 데이터 - 숫자 | 날짜 데이터보다 숫자만큼 일수 이전의 날짜 |
날짜 데이터 - 날짜 데이터 | 두 날짜 데이터 간의 일수 차이 |
날짜 데이터 + 날짜 데이터 | 연산 불가, 지원하지 않음 |
SELECT SYSDATE AS NOW,
SYSDATE-1 AS YESTERDAY,
SYSDATE+1 AS TOMORROW
FROM DUAL;
1을 빼거나 더했을 때 결과 날짜가 하루 이전이나 이후 날짜로 출력된다.
몇 개월 이후 날짜를 구하는 AD_MONTHS 함수
- 특정 날짜에 지정한 개월 수 이후 날짜 데이터를 반환하는 함수이다.
ADD_MONTHS([날짜 데이터(필수)], [더할 개월 수(정수)(필수)]) // 1.
번호 | 설명 |
---|---|
1. | 특정 날짜 데이터에 입력한 개월 수만큼의 이후 날짜를 출력합니다. |
SELECT SYSDATE,
ADD_MONTHS(SYSDATE, 3)
FROM DUAL;
SELECT EMPNO,
ENAME, HIREDATE, SYSDATE
FROM EMP
WHERE ADD_MONTHS(HIREDATE, 486) > SYSDATE;
두 날짜 간의 개월 수 차이를 구하는 MONTHS_BETWEEN 함수
- 두 개의 날짜 데이터를 입력하고 두 날짜 간의 개월 수 차이를 구하는 데 사용한다.
MONTHS_BETWEEN([날짜 데이터1(필수)], [날짜 데이터2(필수)]) // 1.
번호 | 설명 |
---|---|
1. | 두 날짜 데이터 간의 날짜 차이를 개월 수로 계산하여 출력합니다. |
SELECT EMPNO, ENAME, HIREDATE, SYSDATE,
MONTHS_BETWEEN(HIREDATE, SYSDATE) AS MONTHS1,
MONTHS_BETWEEN(SYSDATE, HIREDATE) AS MONTHS2,
TRUNC(MONTHS_BETWEEN(SYSDATE, HIREDATE)) AS MONTHS3
FROM EMP;
MONTHS1, MONTHS2에서 알 수 있듯이 비교 날짜의 입력 위치에 따라 음수 또는 양수가 나올 수 있다. 개월 수 차이는 소수점 단위까지 결과가 나오므로 MONTHS3과 같이 TRUNC 함수를 조합하면 개월 수 차이를 정수로 출력할 수도 있다.
돌아오는 요일, 달의 마지막 날짜를 구하는 NEXT_DAY, LAST_DAY 함수
- NEXT_DAY 함수는 날짜 데이터와 요일 문자열을 입력한다. 입력한 날짜 데이터에서 돌아오는 요일의 날짜를 반환한다.
NEXT_DAY([날짜 데이터(필수)], [요일 문자(필수)]) // 1.
번호 | 설명 |
---|---|
1. | 특정 날짜를 기준으로 돌아오는 요일의 날짜를 출력해 주는 함수입니다. |
LAST_DAY([날짜 데이터(필수)]) // 1.
번호 | 설명 |
---|---|
1. | 특정 날짜가 속한 달의 마지막 날짜를 출력해 주는 함수이다. |
날짜의 반올림, 버림을 하는 ROUND, TRUNC 함수
- 숫자 데이터를 반올림, 버림 처리에 사용한 ROUND, TRUNC 함수는 날짜 데이터를 입력 데이터로 사용할 수도 있다. 이때는 소수점 위치 정보를 입력하지 않고 반올림, 버림의 기준이 될 포맷(format) 값을 지정해 준다.
입력 데이터 종류 | 사용 방식 |
---|---|
숫자 데이터 | ROUND([숫자(필수)], [반올림 위치]) |
TRUNC([숫자(필수)], [버림 위치]) | |
날짜 데이터 | ROUND([날짜데이터(필수)], [반올림 기준 포맷]) |
TRUNC([날짜데이터(필수)], [버림 기준 포맷]) |
⭐ 날짜 데이터 기준에 대해 조금 더 자세한 내용을 알고 싶다면 ISO 공식 웹사이트(iso.org/iso/home/standards/iso8601.htm)를 참조하세요.
SELECT EMPNO, ENAME, EMPNO + '500'
FROM EMP
WHERE ENAME = 'SCOTT';
종류 | 설명 |
---|---|
TO_CHAR | 숫자 또는 날짜 데이터를 문자 데이터로 변환 |
TO_NUMBER | 문자 데이터를 숫자 데이터로 변환 |
TO_DATE | 문자 데이터를 날짜 데이터로 변환 |
문자를 중심으로 숫자 또는 날짜 데이터의 변환이 가능하다.
날짜, 숫자 데이터를 문자 데이터로 변환하는 TO_CHAR 함수
- TO_CHAR 함수는 날짜, 숫자 데이터를 문자 데이터로 변환해 주는 함수이다.
TO_CHAR([날짜 데이터(필수)], '[출력되길 원하는 문자 형태(필수)]') // 1.
번호 | 설명 |
---|---|
1. | 날짜 데이터를 원하는 형태의 문자열로 출력합니다. |
문자 데이터를 숫자 데이터로 변환하는 TO_NUMBER 함수
TO_NUMBER('[문자열 데이터(필수)]', '[인식될 숫자형태(필수)]') // 1.
번호 | 설명 |
---|---|
1. | 문자열을 지정한 형태의 숫자로 인식하여 숫자 데이터로 변환합니다. |
문자 데이터를 날짜 데이터로 변환하는 TO_DATE 함수
TO_DATE('[문자열 데이터(필수)]', '[인식될 날짜형태(필수)]') // 1.
번호 | 설명 |
---|---|
1. | 문자열 데이터를 날짜형의 데이터로 변환합니다. |
NVL 함수의 기본 사용법
NVL([NULL인지 여부를 검사할 데이터 또는 열(필수)],
[앞의 데이터가 NULL일 경우 반환할 데이터](필수)) // 1.
번호 | 설명 |
---|---|
1. | 열 또는 데이터를 입력하여 해당 데이터가 NULL이 아닐 경우 데이터를 그대로 반환하고, NULL인 경우 지정한 데이터를 반환합니다. |
SELECT EMPNO, ENAME, SAL, COMM, SAL+COMM,
NVL(COMM, 0),
SAL+NVL(COMM, 0)
FROM EMP;
EMP 테이블의 급여 외 추가 수당을 의미하는 COMM 열 값이 NULL인 데이터를 0으로 대체하여 연산이 가능하다는 것을 확인할 수 있다. 이렇게 NVL 함수는 NULL 처리를 위해 자주 사용한다.
NVL2 함수의 기본 사용법
- NVL2 함수는 NVL 함수와 비슷하지만 데이터가 NULL이 아닐 때 반환할 데이터를 추가로 지정해 줄 수 있다.
NVL2([NULL인지 여부를 검사할 데이터 또는 열(필수)],
[앞 데이터가 NULL이 아닐 경우 반환할 데이터 또는 계산식(필수)],
[앞 데이터가 NULL일 경우 반환할 데이터 또는 계산식(필수)]) // 1.
번호 | 설명 |
---|---|
1. | 열 또는 데이터를 입력하여 해당 데이터가 NULL이 아닐 때와 NULL일 때 출력 데이터를 각각 지정합니다. |
SELECT EMPNO, ENAME, COMM,
NVL2(COMM, 'O', 'X'),
NVL2(COMM, SAL*12+COMM, SAL*12) AS ANNSAL
FROM EMP;
NVL2 함수는 NVL함수와는 달리 NULL이 아닌 경우에 반환 데이터까지 지정할 수 있으므로 좀 더 다양한 용도로 활용 가능하다.
DECODE 함수
- DECODE 함수는 기준이 되는 데이터를 먼저 지정한 후 해당 데이터 값에 따라 다른 결과 값을 내보내는 함수이다.
DECODE([검사 대상이 될 열 또는 데이터, 연산이나 함수의 결과],
[조건1], [데이터가 조건1과 일치할 때 반환할 결과],
[조건2], [데이터가 조건2와 일치할 때 반환할 결과],
...
[조건n], [데이터가 조건n과 일치할 때 반환할 결과],
[위 조건1~조건n과 일치한 경우가 없을 때 반환할 결과])
CASE문
- 기준 데이터를 반드시 명시하고 그 값에 따라 반환 데이터를 정하는 DECODE 함수와 달리 CASE문은 각 조건에 사용하는 데이터가 서로 상관없어도 된다. 또 기준 데이터 값이 같은(=) 데이터 외에 다양한 조건을 사용할 수 있다.
CASE [검사 대상이 될 열 또는 데이터, 연산이나 함수의 결과(선택)]
WHEN [조건1] THEN [조건1의 결과 값이 true일 때, 반환할 결과]
WHEN [조건2] THEN [조건2의 결과 값이 true일 때, 반환할 결과]
...
WHEN [조건n] THEN [조건n의 결과 값이 true일 때, 반환할 결과]
ELSE [위 조건1~조건n과 일치하는 경우가 없을 때 반환할 결과]
END
SELECT EMPNO, RPAD(SUBSTR(EMPNO, 1, 2), 4, '*') AS MASKING_EMPNO,
ENAME, RPAD(SUBSTR(ENAME, 1, 1), 5, '*') AS MASKING_ENAME
FROM EMP
WHERE LENGTH(ENAME) >= 5
AND LENGTH(ENAME) < 6;
SELECT EMPNO, ENAME, SAL,
TRUNC(SAL/21.5, 2) AS DAY_PAY,
ROUND(SAL/21.5/8, 1) AS TIME_PAY //~~ROUND(DAY_PAY/8, 1) AS TIME_PAY~~
FROM EMP;
SELECT EMPNO, ENAME, HIREDATE,
TO_CHAR(NEXT_DAY(ADD_MONTHS(HIREDATE, 3), '월요일'), 'YYYY-MM-DD') AS R_JOB,
NVL(TO_CHAR(COMM), 'N/A') AS COMM
FROM EMP;
//nvl 데이터 타입 똑같아야
SELECT EMPNO, ENAME, MGR,
CASE
WHEN MGR IS NULL THEN '0000'
WHEN SUBSTR(MGR, 1, 2) = '78' THEN '8888'
WHEN SUBSTR(MGR, 1, 2) = '77' THEN '7777'
WHEN SUBSTR(MGR, 1, 2) = '76' THEN '6666'
WHEN SUBSTR(MGR, 1, 2) = '75' THEN '5555'
ELSE TO_CHAR(MGR)
END AS CHG_MGR
FROM EMP;