: 숫자를 인자로 사용하고 결과값도 숫자를 반환하는 함수
>> ROUND(M, N)
ROUND(123.4567, 3) => 123.457
>> TRUNK(M, N)
TRUNC(123.4567, 3) => 123.456
TRUNC(4567.678, -2) => 4500
--인자로 음수를 주는 경우 확인
>> MOD(M,N)
MOD(10, 4) => 2
>> POWER(M, N)
POWER(2, 4) => 16
>> CEIL(M)
CEIL(2.34) => 3
CEIL(2) => 2
>> FLOOR(M)
FLOOR(2.34)=> 2
>> ABS(M)
ABS(-4) => 4
>> SQRT(M) = POWER(M, 1/2)
SQRT(9) = POWER(9, 1/2) => 3
>> SIGN (M)
SIGN(03) => -1
날짜 포맷 변경
SELECT SYSDATE FROM DUAL; SELECT TO_CHAR(SYSDATE, 'YYYY:MM:DD:HH24:MI:SS') FROM DUAL; SELECT SESSION SET NLS_DATE_FORMANT ='YYYY/MM/DD HH24:MI:SS'); SELECT SYSDATE FROM DUAL;
DUAL : 더미테이블
dual 이라는 의미 없는 속성 하나만 가진 테이블이다.
오라클에서는 select뒤에 반드시 from이 와야하는데,
sysdate 처럼 테이블이 필요 없는 경우에 dual 테이블을 사용한다.
SELECT SYSDATE + 5 FROM DUAL;
SELECT SYSDATE -5 FROM DUAL;
SELECT SYSDATE -5/24 FROM DUAL;
SELECT SYSDATE - (SYSDATE - 5) FROM DUAL;
MONTHS_BETWEEN : 두 날짜간의 기간을 월 수로 계산
MONTHS_BETWEEN(날짜1, 날짜2)
:날짜1 > 날짜 2 인 경우 결과는 양수
MONTHS_BETWEEN('2013/09/01', '2013/01/01') -> 0
ADD_MONTHS(날짜, N)
ADD_MONTHS('2011/07/01', 23) => '2013/06.01'
ADD_MONTHS('2021/05/14', -2) => '2021/03/14'
'-' 붙이면 과거날짜도 구할 수 있음
NEXT_DAY(날짜, 요일)
NEXT_DAY('2013/07/13', '일요일') -> '2019/07/21'
NEXT_DAY('2013/07/13', '1') -> '2019/07/21'
--요일을 숫자로 지정할 수도 있다.
일요일부터 차례대로 1~7
LAST_DAY(날짜)
LAST_DAY('2013/09/24') -> '2013/09/30'
(SYSDATE : 2021/05/18:11:06:00 기준)
LAST_DAY('2013/09/24') -> '2013/09/30'
ROUND(SYSDATE,'YEAR') AS YYYY -> 2021/1/1
ROUND(SYSDATE, 'MONTH')AS MONTH -> 2021/6/1
ROUND(SYSDATE, 'DD')AS DD -> 2021/5/18 --DD는 하루 단위
ROUND(SYSDATE, 'DAY')AS DAY -> 2021/5/16 --DAY는 주 단위
SELECT ROUND(98.765), TRUNC(98.765), ROUND(98.765, 2), TRUNC(98.765, 2) FROM DUAL;
SELECT MOD(19,3), MOD(-19, 3) FROM DUAL;
SELECT CEIL(3.5), FLOOR(3.5) FROM DUAL;
SELECT ENO, ENAME, TRUNC(SAL*12+NVL(COMM, 0) , -2) 연봉
FROM EMP WHERE DNO='10';
입사일 이후 100일째 되는날 등 검사
SELECT SYSDATE 오늘, HDATE 입사일, TRUNC(SYSDATE) - TRUNC(HDATE)+1 근무일,
HDATE + 99 "100일"FROM EMP;
문시현이 오늘까지 일한 일수 검색
SELECT ENAME, TRUNC(SYSDATE)-TRUNC(HDATE)+1 DAY FROM EMP WHERE ENAME = '문시현';
숫자나 날짜를 반올림하거나 잘라내고 출력
SELECT SYSDATE, ROUND(SYSDATE, 'YY')년,
ROUND(SYSDATE, 'MM')월,
ROUND(SYSDATE, 'DD')일
FROM DUAL;
EXERCISE 6.
SELECT SYSDATE, TRUNC(SYSDAET, 'YY') 년
,TRUNC(SYSDATE, 'MM') 월
,TRUNC(SYSDATE, 'DD') 일 FROM DUAL;
20번부서 직원들이 현재까지 근무한 개월수를 검색
SELECT ENO, ENAME, TRUNC(MONTHS_BETWEEN(SYSDATE, HDATE)) 근무개월
FROM EMP
WHERE DNO=20;
20번 부서원들이 입사 100일째 되는날과 10년째 되는날 검색
SELECT ENO, ENAME, HDATE 입사일, HDATE+99 "100일",
ADD_MONTHS(HDATE, 120) "10년" FROM EMP
WHERE DNO= '20';
20번 부서원들이 입사한 이후 첫번째 일요일을 검색
SELECT ENO, ENAME, HDATE, NEXT_DAY(HDATE, '일요일') SUNDAY FROM EMP
WHERE DNO = '20';
20번 부서원들의 입사한 달의 마지막 날짜와 입사한 달에 근무일수 검색
SELECT ENO, ENAME, HDATE, LAST_DAY(HDATE) 마지막날,
LAST_DAY(TRUNC(HDATE)) - TRUNC(HDATE) + 1 "마지막날 근무일수" --띄어쓰기때문에 ""
FROM EMP WHERE DNO = '20';
SELECT PNO, PNAME, HIREDATE, LAST_DAY(TRUNC(HIREDATE)) - TRUNC(HIREDATE)+1 근무일수
FROM PROFESSOR;
SELECT PNO, PNAME, TRUNC((SYSDATE-HIREDATE+1)/7) 근무_주
FROM PROFESSOR;
SELECT PNO, PNAME, HIREDATE
FROM PROFESSOR
--WHERE TRUNC(HIREDATE) BETWEEN '1991/01/01' AND '1995/12/31'; --TRUNC(HIREDATE) : 시간정보 절삭하고 날짜까지만
WHERE TO_CHAR(HIREDATE, 'YYYY') BETWEEN 1991 AND 1995;
SELECT SNO, SNAME, ROUND(AVR/4.0*4.5,2) "4.5환산 평점"
FROM STUDENT
ORDER BY ROUND(AVR/4.0*4.5,2);
SELECT ENO
,ENAME
,LAST_DAY(TRUNC(HDATE)) - TRUNC(HDATE)+1 근무일수
,ROUND(SAL / TO_NUMBER(TO_CHAR(LAST_DAY(HDATE),'DD')),0) 일급여
,ROUND((LAST_DAY(TRUNC(HDATE)) - TRUNC(HDATE)+1) * (SAL / TO_NUMBER(TO_CHAR(LAST_DAY(HDATE),'DD'))),0) 지급액
FROM EMP;
SELECT ENO
,ENAME
,HDATE
,SYSDATE
,TRUNC(SYSDATE) -TRUNC(HDATE)+1 총_근무일
-- TRUNC(MONTHS_BETWEEN(SYSDATE, HDATE)) 총 개월수
,TRUNC(MONTHS_BETWEEN(SYSDATE, HDATE) / 12) 년
,MOD(TRUNC(MONTHS_BETWEEN(SYSDATE, HDATE)) ,12) 개월
,ROUND(SYSDATE - ADD_MONTHS(HDATE, TRUNC(MONTHS_BETWEEN(SYSDATE, HDATE)))) 일
,ROUND(ADD_MONTHS(SYSDATE, -MONTHS_BETWEEN(SYSDATE, HDATE)) - HDATE) 일2
FROM EMP;