DAY-22. Oracle 숫자함수, 날짜함수
🔐 2022-03-31 - 1
데이터베이스
❗ 수업을 듣고, 개인이 공부한 내용을 적은 것 이기에 오류가 많을 수도 있음
1️⃣ 숫자 함수
절대값 구하기 → abs
abs(숫자) : 인자로 전달받은 숫자의 절대값을 반환해주는 함수
select abs(10) from dual; -- 10
select abs(-10) from dual; -- 10
나머지 구하기 → mod()
mod(숫자, 나눌 값) : 인자로 전달받은 숫자를 나눌 값으로 나눠서 나머지를 반환해주는 함수
select mod(10,3) from dual; -- 1
select mod(10,2) from dual; -- 2
반올림 → round()
인자로 받은 숫자를 반올림하여 반환해주는 함수
1) round(숫자)
소수점 바로 아래에서 반올림
select round(45.4) from dual; -- 45
select round(45.5) from dual; -- 46
select round(123.456) from dual; -- 123
select round(123.567) from dual; -- 124
2) round(숫자, 소수점 인덱스 위치)
인자로 받은 숫자를 지정한 위치 다음 자리수에서 반올림하여 반환해주는 함수
-> (소수점 인덱스 + 1) 에서 반올림
select round(123.456,2) from dual; --123.46 출력
-- 123.456에서 소수점 셋째 자리인 6에서 반올림
select round(123.456,-2) from dual; --100 출력
-- 인덱스가 음수로 들어오면 소수점이 아닌 정수부분에서 오른쪽 부터 출발
그래서 123 에서 2에서 반올림
소수점 버리기 → floor()
인자로 받은 숫자의 소수점 자리를 모두 버리고 반환해주는 함수
정수 값만 얻을 수 있음
select floor(123.456) from dual; -- 123
소수점 자르기 → trunc(숫자, 소수점 인덱스 위치)
인자로 받은 숫자를 지정한 위치까지 잘라서 반환해주는 함수 -> 반올림 x
select trunc(123.456,1) from dual; -- 123.4 -- 반올림을 안하고 지정해준 소수점 첫번째자리까지 표기
select round(123.456,1) from dual; -- 123.5 -- 반올림을 한다
소수점 버리고 올리기 → ceil()
인자로 받은 숫자가 소수점 자리를 가지고 있다면 무조건 반올림 하고 소수점을 버림
select ceil(123.456) from dual; -- 124 -- 소수점이 있으니까 반올림 하고 소수점 버리기
select floor(123.456) from dual; -- 123 -- 소수점을 그냥 버리기
결과값 : 정수 | 결과값 : 실수 |
---|---|
floor | round |
ceil | trunc |
2️⃣ 날짜함수
sysdate
시스템에 저장되어있는 현재 날짜(시간포함) 반환
select sysdate from dual; -- 시스템의 현재 날짜
current_date
session(접속)timezone
select current_date from dual;
날짜 개월 수 차이 구하기 → months_between()
months_between(날짜형1, 날짜형2) : 날짜1과 날짜2의 차이를 계산
select months_between(sysdate, hire_date) from employee;
select floor(months_between(sysdate, hire_date) / 12) from employee; -- 근속년수 구하기
날짜 더하기 → add_months()
add_months(기준 날자, 더할 개월 수) : 첫 번째 인자값인 날짜를 기준으로 해서 두 번째 인자값을 더해서 반환해주는 함수
select add_months(sysdate,1) from dual; -- 22/04/30 -- 1개월 더하기
select add_months(sysdate,-1) from dual; -- 22/02/28 -- 1개월 빼기
🔎 employee 테이블에서 사원명, 입사일, 입사 후 6개월이 된 날짜 조회
select emp_name, hire_date, add_months(hire_date,6) "입사 후 6개월" from employee;
가까운 날짜 구하기 → next_day()
next_day(기준 날짜, 요일/숫자) : 기준 날짜를 기준으로 해서 오른쪽에 해당하는 가장 가까운 날짜를 반환해주는 함수
요일 표기
- 한글 : ‘월’, ‘월요일’
- 숫자의 의미 : 1 -> 일요일 2-> 월요일 …. 7-> 토요일 ==> 요일을 번호로 바꾼것
select next_day(sysdate,'월') from dual; -- 오늘 날짜를 기준으로 가장 가까운 월요일은 22/04/04
select next_day(sysdate,'월요일') from dual;
select next_day(sysdate,2) from dual; -- 2는 월요일을 의미
그 달의 마지막 날 구하기 → last_day()
last_day(기준 날짜) : 기준 날짜를 바탕으로 해서 해당 날짜가 속한 달의 마지막 날을 반환해주는 함수
select last_day(add_months(sysdate,-1)) from dual; -- 22/02/28
// sysdate는 현재를 기준으로 22/03/31 에다가 add_months로 -1을 더해줘 22/02/28이 되고
// 02월의 last_day는 02/28이기에 22/02/28 출력
🔎 다음달의 마지막 날
select last_day(add_months(sysdate,1)) from dual;
// sysdate는 현재를 기준으로 22/03/31 에다가 add_months로 1을 더해줘 22/04/30이 되고
// 04월의 last_day는 04/30이기에 22/04/30 출력
기준 날짜를 기준으로 년도,월,일 뽑기 → extract()
기준날짜로 부터 년/월/일을 추출해서 반환해주는 함수
- extract(year/month/day from date(기준날짜)
🔎
select extract(year from sysdate) from dual; -- 22
select extract(month from sysdate) from dual; -- 03
select extract(day from sysdate) from dual; -- 31
🔎 employee 테이블에서 사원명, 입사년도, 입사월, 입사일을 조회
select emp_name,
hire_date,
extract(year from hire_date),
extract(month from hire_date),
extract(day from hire_date),
from employee;
🔎
employee 테이블 사원명, 입사일, 년차를 출력
입사일 -> yyyy년 mm월 dd일 형식으로 출력
년차 출력 시에는 소수점은 올림으로 처리 -> 28.144 -> 29년차
출력 시에 정렬은 입사일 기준으로 오름차순
1번 풀이
select emp_name"이름",
extract(year from hire_date) || '년' ||
extract(month from hire_date)|| '월' ||
extract(month from hire_date)|| '일' "입사일",
ceil((sysdate-hire_date)/365) "입사년차"
from employee // 여기서 '년차'를 붙이면 오름차순 x
order by "입사일" asc;
❗ 문자열을 기준으로 order by -> 문자로써 더 작은 숫자를 작다고 인식(10과 3이 있다면 10이 더 작은 수 -> 앞자리 만 보니까)
2번 풀이
select emp_name"이름",
concat(extract(year from hire_date),'년') ||
concat(extract(month from hire_date),'월') ||
concat(extract(month from hire_date),'일') "입사일" ,
ceil((sysdate-hire_date)/365)||'년차' "입사년차" from employee
order by "입사일" asc;
🔎
특별 보너스를 지급 -> 자료가 필요
employee -> 입사일을 기준으로 다음달 1일 부터 6개월을 계산해서 조회
사원명, 입사일, 기준일, 기준일 + 6개월
22/01/05 입사 -> 22/02/01 기준일 -> 22/08/01 기준일 + 6개월
출력할 때 입사일 기준으로 출력
1번 풀이
select * from employee;
select emp_name,
hire_date,
add_months( trunc(hire_date,'MM'), 1 ),
add_months(ADD_MONTHS( TRUNC(hire_date,'MM'), 1 ),6)
from employee
order by hire_date asc;
2번 풀이
select emp_name "사원명",
hire_date "입사일",
last_day(hire_date) + 1 "기준일",
add_months(last_day(hire_date) + 1,6) "기준일 + 6개월"
from employee
order by hire_date asc;
Leave a comment