DAY-22. Oracle 숫자함수, 날짜함수

3 minute read

🔐 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. 숫자의 의미 : 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;

Categories:

Updated:

Leave a comment