SELECT round(24232.2535,3),
round(24232.2535,1),
round(24235.2535,-1),
round(24272.2535,-2),
trunc(2423.23,-1),
trunc(2423.23,1),
trunc(2423.23,-2)
FROM dual;
ex) 급여를 부서번호(10==>10%, 20==>20%)기준으로 인상을 하기로 했다.
현재 급여와 인상된 급여를 처리하되 100자리 단위로 절삭하여 사원명과 함께 출력하세요.
SELECT ename, trunc(sal,2), sal*(deptno/100) 인상분, trunc(sal+(sal*(deptno/100)),-2) 인상된급여
FROM emp;
3) mod : 데이터베이스에서 산술연산자 %대신 쓰이는 나머지 처리 함수를 말한다.
mod(데이터, m) : 데이터를 m으로 나눈 나머지 값
ex) mod(10,3) ==> 1
SELECT mod(10,3) s1, mod(10,2) s2, mod(10,3) FROM dual;
ex) 사번이 짝수인 데이터를 사번, 구분자(0/1), 이름으로 출력하세요
SELECT empno, MOD(empno,2)div, ename
FROM EMP e
WHERE mod(empno,2) = 0;
4) ceil : 지정한 값보다 큰 수 중에서 가장 작은 정수
소숫점이하의 내용에 대하여 올림 정수
정수형 올림(소숫점 이하 데이터)
5) floor : 지정한 값보다 작은 수 중에서 가장 큰 정수
소숫점 이하의 내용에 대하여 내림 정수
정수형 내림(소숫점 이하 데이터)
SELECT ceil(253.243) num01, floor(253.243) num02 FROM dual;
SELECT *
FROM emp;
ex) 현재 급여를 12로 나눈 월급여를 내림/올림 결과에 따라 출력하세요
사원명, 급여, 월급여(내림), 월급여(올림)
SELECT ename, sal, trunc(sal/12) "월급여(내림)", CEIL(sal/12) "월급여(올림)"
FROM emp;
1/1000 => 1초 => (60)1분 => (60)1시간 => (24)1일 => (28,30,31) 1월 => (12)1냔
SELECT sysdate 현재,
sysdate + 1 내일,
sysdate -1 전날,
sysdate +(10/24) "10시간 이후",
add_months(sysdate,1) "한달 후"
FROM dual;
ex) 사원번호, 사원명, 입사일(입사전 8시간, 입사일), 인턴기간(입사후 120일, 근무일수)를 아래와 같이 출력하세요.
SELECT empno,
ename,
(hiredate-8/24) 입사 8시간 전,
hiredate 입사일,
hiredate+120 인턴기간(입사후 120일),
floor(sysdate-hiredate) 근무일수
FROM emp;
5/19, 6/19 => 1개월, 15일 => 0.5개월
SELECT ename,
hiredate,
months_between(sysdate,hiredate) "근무개월수",
floor(months_between(sysdate, hiredate)) "근무개월수2",
floor(months_between(sysdate, hiredate)/12) "근무연한"
FROM emp;
ex) 오늘로부터 100일 후, 개월수를 출력(dual, 소숫점이하 표기, 절삭하기)
SELECT floor(MONTHS_BETWEEN(sysdate+100, sysdate))
FROM dual;
-------------------------------------------------------------------
SELECT sysdate,
sysdate+100,
MONTHS_BETWEEN(sysdate+100, sysdate) "100일후 개월수1",
floor(MONTHS_BETWEEN(sysdate+100, sysdate)) "100일후 개월수2"
FROM dual;
SELECT sysdate, add_months(sysdate, 4)
FROM dual;
--ex) 사원정보를 통해 부서별로 인턴기간을 다르게 처리하다고 한다. 인턴기간의 만료일
-- 10==> 1개월, 20 ==> 2개월, .. 30 ==> 3개월
SELECT ename, deptno, hiredate, deptno/10 "인턴기간(개월)", add_months(hiredate,
deptno/10)
FROM emp;
형식: next_day(지정한 날짜, '요일') : 지정한 날짜로부터 가장 빠른 요일의 날짜
SELECT next_day(sysdate, '일') "가장 빠른 일요일"
FROM dual;
ex) 사원들이 입사하고 처음 토요일 여행을 가기로 했다. 사원명, 입사일, 첫번째 토요일을 출력하세요.
SELECT ename "사원명", hiredate "입사일", next_day(hiredate, '토') "첫번째 토요일"
FROM emp;
SELECT last_day(sysdate) "이번달 마지막",
last_day(sysdate)+1 "다음달 일"
FROM dual;
ex) 사원의 첫급여일이 다음달 첫날로 지정하였다. 급여일과 근무일수를 출력하세요.
SELECT ename "사원명",
hiredate "입사일",
last_day(hiredate)+1 "첫급여일",
(last_day(hiredate)+1)-hiredate "입사월근무일수",
ceil(last_day(hiredate)-hiredate+1) "입사월근무일수2"
FROM emp;
oracle에서는 크게, 문자열형, 숫자형, 날짜형으로 나누어진다.
각 데이터는 유형에 따라서 변환이 일어난다.
문자열 ==> 숫자, 숫자 ==> 문자열
숫자 ==> 날짜, 날짜 ==> 숫자
날짜 ==> 문자열, 문자열 ==> 날짜
형변환의 유형
1) 묵시적 형변환 : oracle 서버에서 자동적으로 형변환을 하여 처리한다.
2) 명시적 형변환 : 변환 함수를 통해서 명시적으로 형변환을 처리한다.
묵시적인 데이터 타입 변환은 정확한 연산을 위하여 오라클서버 시스템 내부에서 타입을 내부적으로 변환해서 처리 해주는 경우를 말한다.
-- 문자열을 묵시적으로 숫자로 변환해서 조건처리
SELECT *
FROM EMP e
WHERE sal = '800';
-- 명시적 형변환인 to_number()함수를 통해서 처리한다.
SELECT *
FROM EMP e
WHERE sal = to_number('800'); -- 날짜형의 묵시적 형변환
SELECT ename, hiredate
FROM EMP e
WHERE hiredate LIKE '%81%';
-- 묵시적으로 hiredate는 to_char()가 적용이 된 내용으로 비교한다.
-- 주의) 1981형태의 데이터는 기본 묵시형 변환에 포함되어 있지 않으므로 to_char(hiredate,'YYYY')로 설정하여 비교하여야 한다.
SELECT ename, hiredate, to_char(hiredate)
FROM EMP e
WHERE to_char(hiredate) LIKE '%81%';
to_char(number|date타입, 'format')
SELECT sysdate,
to_char(sysdate, 'CC'), -- 세기 표현
to_char(sysdate, 'YYYY'), -- 연도 표현
to_char(sysdate, 'MM'), -- 월 표기
to_char(sysdate, 'DD'), -- 일 표기
to_char(sysdate, 'DAY'), -- 요일 표기
to_Char(Sysdate, 'YYYY/MM/DD') -- 현재날짜를 YYYY/MM/DD 표기
FROM dual; -- ex) to_char 활용하여, 1980에 입사한 사원의 이름, 입사년도, 입사월, 입사일을 출력
SELECT ename 사원이름, hiredate,
to_char(hiredate, 'YYYY') 입사년도, to_char(hiredate, 'MM') 입사월, to_char(hiredate, 'DD') 입사일
FROM emp
WHERE to_char(hiredate, 'YYYY') = '1980';
SELECT ename,
hiredate,
to_char(hiredate, 'Q') "분기", to_char(hiredate, 'MONTH') "월",
to_char(hiredate, 'MM') "월", to_char(hiredate, 'WW') "연단위(주)",
to_char(hiredate, 'W') "월단위(주)", to_char(hiredate, 'DAY') "요일"
FROM emp;
-- ex) 1981년도 1/4 분기에 입사한 사원이 이름, 입사년도, 월단위 주, 월, 날짜를 표기하세요.
SELECT ename, hiredate,
to_char(hiredate, 'YYYY') "입사년도", to_char(hiredate, 'W') "월단위(주)", to_char(hiredate, 'MONTH') "월", to_char(hiredate, 'DAY') "요일", to_char(hiredate, 'Q') "분기"
FROM emp
--WHERE to_char(hiredate, 'YYYY') = '1981' AND to_char(hiredate, 'Q') = 1;
WHERE to_char(hiredate, 'YYYY Q') = '1981 1';
SELECT ename,
sal,
to_char(sal, '$9999') "달러표기",
to_char(sal, '9999.99') "소숫점 표기",
to_char(sal, '9,999,999') "첫단위 콤마"
FROM emp;
--ex) 사원명, 급여, 급여+보너스(천단위 콤마표기) 총계로 출력하세요.
SELECT ename "사원명",
sal "급여",
comm "보너스",
to_char(sal+comm, '9,999,999') "급여+보너스"
FROM emp;
SELECT ename "사원명",
sal "급여",
comm "보너스",
to_char(sal + nvl(comm,0),'9,999,999') "급여+보너스"
FROM emp;
-- 문자열로 '2000'인 데이터를 이용하여 2000이상인 급여 데이터를 조회 처리
SELECT *
FROM emp
WHERE sal >= to_number('2000');
-- 입사일이 3분기, 4분기 데이터를 검색하고자 한다.
SELECT ename, hiredate, to_char(hiredate, 'Q') "분기",
to_number(to_char(hiredate, 'Q')) "분기(숫자)"
FROM EMP
WHERE to_number(to_char(hiredate, 'Q')) >= 3;
-- ex) 입사일이 15일 이후인 사원들을 출력하세요.
SELECT *
FROM EMP e
WHERE to_number(to_char(hiredate, 'DD')) >= 15;
-- 입사년도 1981 ==> 올해연도로 변환하여 데이터를 출력
SELECT ename,
hiredate,
to_char(sysdate, 'YYYY') || to_char(hiredate, 'MMDD') "올해입사",
to_date(to_char(sysdate, 'YYYY') || to_char(hiredate, 'MMDD')) "날짜형변경"
FROM emp;
SELECT to_char(sysdate, 'AM HH:MI:SS') "현재시간(12)"
FROM dual;
-- ex) 사원정보테이블에서 사원명, 입사일+현재시간 표현 @@@년 @@월 @@일
-- 24시간표 @@시 @@분 @@초 표현하여 출력하세요.
SELECT ename,
hiredate,
to_char(hiredate,'YYYY"년" MM"월" DD"일"') "날짜
to_char(sysdate,'HH24"시" MI"분" SS"초"') "시간",
to_char(hiredate,'YYYY"년" MM"월" DD"일"') || to_char(sysdate,'HH24"시" MI"분" SS"초"') "날짜와 현재시간",
to_date( to_char(hiredate,'YYYYMMDD ') || to_char(sysdate,'HH24MISS'),'YYYYMMDD HH24MISS') "날짜형 변경"
FROM emp;
SELECT ename,
sal,
to_char(sal, '99999') "형식1",
to_char(sal, '00000') "형식2",
to_char(sal, '$9999') "형식3",
to_char(sal, '9,999') "형식4",
to_char(sal, '9,999.999') "형식5",
to_char(sal*1000000, '9,999.999') "형식6"
FROM emp;