- 이 글은 도서 '초보자를 위한 SQL 200제'라는 책을 바탕으로 작성되었습니다.
- 이전 과정의 연습문제를 확인하고 싶으면 다음을 참고하시기 바랍니다.
[SQL]초보자를 위한 SQL 200제 문제풀이 모음
이 글은 현재까지 작성된 문제풀이를 기준으로 작성되었습니다. (2021. 06. 24 업데이트 기준) P A R T 1 입문 SQL 첫발 내딛기 001 ~ 004 [SQL] PART1 - 01 초보자를 위한 SQL 200제 문제풀이(001~004) - 이 글..
seoyuun22.tistory.com
023 반올림해서 출력하기(ROUND)
숫자를 출력 시 반올림을 하기 위해서는 ROUND 함수를 사용합니다.
SELECT ROUND(숫자, 반올림해 나태내고 싶은 자리)
FROM DUAL;
ROUND 함수에는 반올림할 숫자를 적고, 반올림을 통해 나타내고 싶은 자릿수를 적습니다.
EX) 693.281을 소수점 이후 첫째 자리까지 나타내고 싶은 경우
소수 둘째 자리에서 반올림을 하여 693.281 -> 693.3가 되어야 합니다.
숫자 | 6 | 9 | 3 | . | 2 | 8 | 1 |
자리 | -3 | -2 | -1 | 0 | 1 | 2 | 3 |
SELECT ROUND(693.281,2)
FROM DUAL;
EX) 693.281을 첫째 자리(일의 자리)까지 나타내고 싶은 경우
소수점을 기준으로 두고 소수점 이후 첫 번째 자리에서 반올림을 하여 693.281 -> 693가 되어야 합니다.
이때 기준은 소수점이기 때문에 반올림해 나타내고 싶은 자리를 0으로 두고 반올림합니다.
숫자 | 6 | 9 | 3 | . | 2 | 8 | 1 |
자리 | -3 | -2 | -1 | 0 | 1 | 2 | 3 |
SELECT ROUND(693.281,0)
FROM DUAL;
SELECT ROUND(693.281)
FROM DUAL;
ROUND(숫자, 0)의 결과는 ROUND(숫자)의 결과와 동일합니다. (ROUND의 디폴트가 0)
EX) 693.281을 둘째 자리(십의 자리)까지 나타내고 싶은 경우
첫째 자리(일의 자리)에서 반올림을 하여 693.281 -> 690이 되어야 합니다.
숫자 | 6 | 9 | 3 | . | 2 | 8 | 1 |
자리 | -3 | -2 | -1 | 0 | 1 | 2 | 3 |
SELECT ROUND(693.281,-1)
FROM DUAL;
Q. 876.567 숫자를 출력하라, 단 소수점 두 번째 자리인 6에서 반올림해서 출력하라.
소수점 두 번째 자리에서 반올림하여 소수점 첫 번째 자리까지 나타낼 것이므로 자릿수는 1이다.
SELECT 876.567, ROUND(876.567,1)
FROM DUAL;

024 숫자를 버리고 출력하기 (TRUNC)
숫자 출력 시 특정 자리의 숫자를 버리고 출력하기 위해 TRUNC 함수를 사용합니다.
SELECT TRUNC(숫자, 나타내고 싶은 자리 수)
FROM DUAL;
TRUNC 함수에는 특정 자리 숫자를 버릴 숫자와 남기고 싶은 자릿수를 입력합니다.
EX) 693.281에서 소수점 이후 첫 번째 자리 이후 두 번째 자리부터 버리고 출력하고 싶은 경우 693.281 → 693.2가 되어야 합니다
숫자 | 6 | 9 | 3 | . | 2 | 8 | 1 |
자리 | -3 | -2 | -1 | 0 | 1 | 2 | 3 |
▼
숫자 | 6 | 9 | 3 | . | 2 |
자리 | -3 | -2 | -1 | 0 | 1 |
SELECT TRUNC(693.281,1)
FROM DUAL;
EX) 693.281에서 첫 번째 자리 이후 소수점 자리부터 버리고 출력하고 싶은 경우 693.281 → 693가 되어야 합니다.
0의 자리는 소수점 자리이기 때문에 소수점을 기준으로 두고 소수점 이후를 전부 버리고 출력합니다.
숫자 | 6 | 9 | 3 | . | 2 | 8 | 1 |
자리 | -3 | -2 | -1 | 0 | 1 | 2 | 3 |
▼
숫자 | 6 | 9 | 3 | . |
자리 | -3 | -2 | -1 | 0 |
SELECT TRUNC(693.281,0)
FROM DUAL;
SELECT TRUNC(693.281)
FROM DUAL;
TRUNC(숫자, 0)의 결과는 TRUNC(숫자)의 결과는 동일합니다. (TRUNC의 디폴트가 0)
EX) 693.281에서 십의 자리 이후 일의 자리부터 버리고 출력하고 싶은 경우 693.281 → 690가 되어야 합니다
숫자 | 6 | 9 | 3 | . | 2 | 8 | 1 |
자리 | -3 | -2 | -1 | 0 | 1 | 2 | 3 |
▼
숫자 | 6 | 9 | 0 |
자리 | -3 | -2 | -1 |
SELECT TRUNC(693.281,-1)
FROM DUAL;
Q. 876.567 숫자를 출력하라. 단 소수점 두 번째 자리인 6과 그 이후의 숫자들은 모두 버리고 출력하라
소수점 주 번째 자리부터 버리고 소수점 첫 번째 자리까지 남기기 때문에 함수 안에 들어갈 자리 수는 1이다.
SELECT TRUNC(876.567,1)
FROM DUAL;

025 나눈 나머지 값 출력하기 (MOD)
숫자 값을 나눈 나머지의 값을 출력할 때 MOD 함수를 사용합니다.
SELECT MOD(나눠지는 수, 나누는 수)
FROM DUAL;
EX) 15를 4로 나눈 나머지의 값을 출력하라
SELECT MOD(15,4)
FROM DUAL;

Q. 숫자 10을 3으로 나눈 나머지 값을 출력하라
나누는 수 = 3, 나누어지는 수 =10
SELECT MOD(10,3)
FROM DUAL;

Q. 사원 번호와 사원 번호가 홀수이면 1, 짝수이면 0을 출력하라.
홀수는 2로 나누었을 때 나머지가 1, 짝수는 나머지가 0인 점을 이용하여 계산한다.
SELECT EMPNO, MOD(EMPNO,2)
FROM EMP;

Q. 사원번호가 짝수인 사원들의 사원 번호와 이름을 출력하라.
WHERE 절을 활용하여 사원번호를 2로 나누었을 때 나머지가 0인 사원번호와 사원 이름을 출력하면 된다.
SELECT EMPNO, ENAME
FROM EMP
WHERE MOD(EMPNO,2) = 0;

나머지를 구하는 함수가 MOD 함수라면 나눈 몫을 구하는 FLOOR 함수가 있습니다.
SELECT FLOOR(나눠지는 수 / 나누는 수)
FROM DUAL;
EX) 15를 4로 나눈 몫을 출력하라
SELECT FLOOR(15 / 4)
FROM DUAL;


15를 나눈 값은 3.75이지만 FLOOR 함수는 3과 4 사이에서의 제일 바닥에 해당하는 값인 3을 출력합니다.
Q. 숫자 10을 3으로 나눈 몫을 출력하라
SELECT FLOOR(10 / 3)
FROM DUAL;

026 날짜 간 개월 수 출력하기 (MONTHS_BETWEEN)
날짜와 날짜 사이의 개월 수를 출력할 때 MONTHS_BETWEEN 함수를 사용합니다.
SELECT MONTHS_BETWEEN('날짜1', '날짜2')
'날짜 1'과 '날짜 2'에는 날짜 값을 입력받아 숫자 값을 출력합니다. MONTHS_BETWEEN 함수에 날짜 값을 입력할 때 '날짜 1' 자리에는 최신의 날짜를, '날짜 2'에는 예전 날짜로 입력해야 합니다. 즉 '날짜 1'이 '날짜 2' 보다 최신이어야 합니다.
EX ) 2019년 9월 1일에서 2021년 6월 30일 사이의 개월 수를 출력하시오.
SELECT MONTHS_BETWEEN('2021-06-30','2019-09-30') AS MONTH_BTEWEEN
FROM DUAL;

Q. 사원의 이름과 입사한 날짜부터 오늘 총 몇 달을 근무했는지 출력하라.
※ 오늘 날짜를 출력하는 함수는 SYSDATE 함수입니다.
SELECT ENAME, ROUND(MONTHS_BETWEEN(SYSDATE, HIREDATE),4) AS 근무
FROM EMP;
SYSDATE는 오늘 날짜를 확인하는 함수로 2021년 6월 29일을 기준으로 출력된 결과입니다.
소수점 밑에 자리 숫자가 길어 넷째 자리까지 만을 출력하여 이를 근무라는 별칭을 두었습니다.

MONTHS_BETWEEN 함수를 이용하지 않고 날짜만으로 연산을 해야 할 경우 다음과 같이 날짜와 산술 연산만을 이용하여 산술식을 작성해야 합니다.
SELECT TO_DATE('날짜1', '날짜 형식') - TO_DATE('날짜2', '날짜 형식')
FROM DUAL;
날짜 형식은 지난 008번 연습문제를 참고하면 좀 더 자세히 알 수 있습니다.
[SQL] PART1 - 02 초보자를 위한 SQL 200제 문제풀이 (005-009)
- 이 글은 도서 '초보자를 위한 SQL 200제'라는 책을 바탕으로 작성되었습니다. - 들어가기에 앞서 SQL의 종류에 대한 글을 선행하고 오시는 걸 추천드립니다 [SQL] SQL의 종류 - DDL, DML,DCL SQL은 구조화
seoyuun22.tistory.com
EX) 2019년 6월 1일에서 2021년 6월 30일 사이의 총일수를 출력하라
2019년 6월 1일에서 2021년 6월 30일 사이의 총일수를 출력하려면 최신인 날짜 2021년 6월 30일부터 작성합니다.
SELECT TO_DATE('2021-06-30','YYYY-MM-DD') - TO_DATE('2019-06-01','YYYY-MM-DD') AS 날짜계산
FROM DUAL;

Q. 2018년 10월 1일에서 2019년 6월 1일 사이의 총일수를 출력하라.
SELECT TO_DATE('2018-10-01','YYYY-MM-DD') - TO_DATE('2019-06-01','YYYY-MM-DD')
FROM DUAL;

위에서 구한 일수를 이용하여 총 주(Week) 수를 구할 수 있습니다. 총일수를 구한 후, 구한 값을 7로 나누어 반올림하면 총주수를 구할 수 있습니다.
SELECT ROUND((TO_DATE('날짜1', '날짜 형식') - TO_DATE('날짜2', '날짜 형식')) / 7)
FROM DUAL;
EX) 2019년 6월 1일에서 2021년 6월 30일 사이의 총주수를 출력하라
2019년 6월 1일에서 2021년 6월 30일 사이의 총주수를 출력하려면 최신인 날짜 2021년 6월 30일부터 작성합니다.
SELECT ROUND((TO_DATE('2021-06-30', 'YYYY-MM-DD') - TO_DATE('2019-06-01', 'YYYY-MM-DD')) / 7) AS 총_주수
FROM DUAL;

Q. 2018년 10월 1일에서 2019년 6월 1일 사이의 총 주(Week) 수를 출력하라.
SELECT ROUND((TO_DATE('2019-06-01', 'YYYY-MM-DD') - TO_DATE('2018-10-01', 'YYYY-MM-DD')) / 7) AS 총_주수
FROM DUAL;

027 개월 수 더한 날짜 출력하기 (ADD_MONTHS)
특정 날짜에서 개월 수를 더한 날짜를 출력할 때 ADD_MONTHS 함수를 사용합니다.
SELECT ADD_MONTHS(TO_DATE('날짜','날짜 형식'), 더할 개월 수)
FROM DUAL;
EX) 2021년 6월 1일부터 40달 뒤의 날짜는 어떻게 되는지 출력하라
SELECT ADD_MONTHS(TO_DATE('2021-06-01','YYYY-MM-DD'), 40)
FROM DUAL;

Q. 2019년 5월 1일로부터 100달 뒤의 날짜는 어떻게 되는지 출력하라.
SELECT ADD_MONTHS(TO_DATE('2019-05-01','YYYY-MM-DD'), 100)
FROM DUAL;

만약 더하는 기준이 달(MONTH)이 아닌 일(DAY)인 경우 일반적인 날짜형 TO_DATE의 값에 숫자를 더해주면 더한 숫자만큼의 일수 이후의 날짜를 출력한다.
SELECT TO_DATE('날짜','날짜 형식') + 숫자
FROM DUAL;
EX ) 2021년 12월 25일로부터 100일 전 날짜는 어떻게 되는지 출력하라.
SELECT TO_DATE('2021-12-25','RRRR-MM-DD') - 100
FROM DUAL;

빼기(-) 연산을 통해 21년 12월 25일로부터 100일 전은 21년 9월 16일임을 확인할 수 있다.
Q. 2019년 5월 1일로부터 100일 후에 돌아오는 날짜는 어떻게 되는지 출력하라.
SELECT TO_DATE('2019-05-01','RRRR-MM-DD') + 100
FROM DUAL;

028 특정 날짜 뒤에 오는 요일 날짜 출력하기 (NEXT_DAY)
특정 날짜 다음에 돌아오는 특정 요일의 날짜를 출력하기 위해서는 NEXT_DAY 함수를 사용합니다.
SELECT NEXT_DAY('날짜', '요일')
FROM DUAL;
EX ) 2021년 6월 30일로부터 바로 돌아올 화요일의 날짜가 어떻게 되는지 출력하라
SELECT '21-06-30' AS 날짜, NEXT_DAY('21-06-30', '화요일')
FROM DUAL;


달력을 통해서 6월 30일로부터 바로 돌아오는 화요일은 7월 6월임을 확인할 수 있습니다.
Q. 2019년 5월 22일로부터 바로 돌아올 월요일의 날짜가 어떻게 되는지 출력하라
SELECT '19-05-22' AS 날짜, NEXT_DAY('19-05-22', '월요일')
FROM DUAL;

Q. 오늘부터 앞으로 돌아올 화요일의 날짜를 출력하라
오늘 날짜를 나타내는 함수 SYSDATE를 이용하여 출력합니다.
SELECT SYSDATE, NEXT_DAY(SYSDATE, '화요일')
FROM DUAL;

NEXT_DAY 함수의 경우 중첩해서 사용이 가능합니다. 예를 들어 앞에서 배웠던 개월 수를 더한 날짜를 출력했던 ADD_MONTHS 함수와 함께 사용한 예제를 풀어보겠습니다.
EX ) 2021년 6월 29일로부터 3달 뒤에 돌아오는 월요일의 날짜를 출력하라
먼저 2021년 6월 29일로부터 3달이 지난 날짜를 출력해야 합니다. → ADD_MONTH('2021-06-20', 3)
위에서 구한 날짜로부터 요일을 구해야 합니다 → NEXT_DAY(ADD_MONTH('2021-06-20', 3), '월요일')
이를 바탕으로 SQL을 작성하면 다음과 같습니다.
SELECT NEXT_DAY(ADD_MONTHS('2021-06-29', 3), '월요일')
FROM DUAL;

Q. 2019년 5월 22일부터 100달 뒤에 돌아오는 화요일의 날짜를 출력하라
먼저 2019년 5월 22일로부터 100달이 지난 날짜를 출력해야 합니다. → ADD_MONTH('2019-05-22', 100)
위에서 구한 날짜로부터 요일을 구해야 합니다 → NEXT_DAY(ADD_MONTHS('2019-05-22', 3), '화요일')
SELECT NEXT_DAY(ADD_MONTHS('2019-05-22', 100), '화요일')
FROM DUAL;

Q. 오늘로부터 100달 뒤에 돌아오는 월요일의 날짜 출력
먼저 오늘로부터 100달이 지난 날짜를 출력해야 합니다. → ADD_MONTH(SYSDATE, 100)
위에서 구한 날짜로부터 요일을 구해야 합니다 → NEXT_DAY(ADD_MONTHS(SYSDATE, 3), '월요일')
SELECT NEXT_DAY(ADD_MONTHS(SYSDATE, 3), '월요일')
FROM DUAL;

029 특정 날짜가 있는 달의 마지막 날짜 출력하기 (LAST_DAY)
특정 날짜가 있는 달의 마지막 날짜를 출력할 때 LAST_DAY 함수를 사용합니다.
SELECT LAST_DAY('DATE')
FROM DUAL;
EX) 2021년 4월 13일 해당 달의 마지막 날짜가 어떻게 되는지 출력하라
SELECT '21/04/13' AS 날짜 , LAST_DAY('2021/04/13') AS 마지막날짜
FROM DUAL;

Q. 2019년 5월 22일 해당 달의 마지막 날짜가 어떻게 되는지 출력하라
SELECT '19/05/22' AS 날짜 , LAST_DAY('19/05/22') AS 마지막날짜
FROM DUAL;

Q. 오늘부터 이번 달 말일까지 총 며칠 남았는지 출력하라
오늘 날짜를 나타내는 함수 SYSDATE ( =21년 6월 29일) 기준으로 결과를 출력한다
SELECT LAST_DAY(SYSDATE) - SYSDATE
FROM DUAL;

Q. 이름이 KING인 사원의 이름, 입사일, 입사한 달의 마지막 날짜를 출력하라
WHERE 절을 이용하여 이름이 KING인 사원만의 정보를 출력합니다.
SELECT ENAME, HIREDATE, LAST_DAY(HIREDATE)
FROM EMP
WHERE ENAME = 'KING';

'Study > SQL' 카테고리의 다른 글
- 이 글은 도서 '초보자를 위한 SQL 200제'라는 책을 바탕으로 작성되었습니다.
- 이전 과정의 연습문제를 확인하고 싶으면 다음을 참고하시기 바랍니다.
[SQL]초보자를 위한 SQL 200제 문제풀이 모음
이 글은 현재까지 작성된 문제풀이를 기준으로 작성되었습니다. (2021. 06. 24 업데이트 기준) P A R T 1 입문 SQL 첫발 내딛기 001 ~ 004 [SQL] PART1 - 01 초보자를 위한 SQL 200제 문제풀이(001~004) - 이 글..
seoyuun22.tistory.com
023 반올림해서 출력하기(ROUND)
숫자를 출력 시 반올림을 하기 위해서는 ROUND 함수를 사용합니다.
SELECT ROUND(숫자, 반올림해 나태내고 싶은 자리)
FROM DUAL;
ROUND 함수에는 반올림할 숫자를 적고, 반올림을 통해 나타내고 싶은 자릿수를 적습니다.
EX) 693.281을 소수점 이후 첫째 자리까지 나타내고 싶은 경우
소수 둘째 자리에서 반올림을 하여 693.281 -> 693.3가 되어야 합니다.
숫자 | 6 | 9 | 3 | . | 2 | 8 | 1 |
자리 | -3 | -2 | -1 | 0 | 1 | 2 | 3 |
SELECT ROUND(693.281,2)
FROM DUAL;
EX) 693.281을 첫째 자리(일의 자리)까지 나타내고 싶은 경우
소수점을 기준으로 두고 소수점 이후 첫 번째 자리에서 반올림을 하여 693.281 -> 693가 되어야 합니다.
이때 기준은 소수점이기 때문에 반올림해 나타내고 싶은 자리를 0으로 두고 반올림합니다.
숫자 | 6 | 9 | 3 | . | 2 | 8 | 1 |
자리 | -3 | -2 | -1 | 0 | 1 | 2 | 3 |
SELECT ROUND(693.281,0)
FROM DUAL;
SELECT ROUND(693.281)
FROM DUAL;
ROUND(숫자, 0)의 결과는 ROUND(숫자)의 결과와 동일합니다. (ROUND의 디폴트가 0)
EX) 693.281을 둘째 자리(십의 자리)까지 나타내고 싶은 경우
첫째 자리(일의 자리)에서 반올림을 하여 693.281 -> 690이 되어야 합니다.
숫자 | 6 | 9 | 3 | . | 2 | 8 | 1 |
자리 | -3 | -2 | -1 | 0 | 1 | 2 | 3 |
SELECT ROUND(693.281,-1)
FROM DUAL;
Q. 876.567 숫자를 출력하라, 단 소수점 두 번째 자리인 6에서 반올림해서 출력하라.
소수점 두 번째 자리에서 반올림하여 소수점 첫 번째 자리까지 나타낼 것이므로 자릿수는 1이다.
SELECT 876.567, ROUND(876.567,1)
FROM DUAL;

024 숫자를 버리고 출력하기 (TRUNC)
숫자 출력 시 특정 자리의 숫자를 버리고 출력하기 위해 TRUNC 함수를 사용합니다.
SELECT TRUNC(숫자, 나타내고 싶은 자리 수)
FROM DUAL;
TRUNC 함수에는 특정 자리 숫자를 버릴 숫자와 남기고 싶은 자릿수를 입력합니다.
EX) 693.281에서 소수점 이후 첫 번째 자리 이후 두 번째 자리부터 버리고 출력하고 싶은 경우 693.281 → 693.2가 되어야 합니다
숫자 | 6 | 9 | 3 | . | 2 | 8 | 1 |
자리 | -3 | -2 | -1 | 0 | 1 | 2 | 3 |
▼
숫자 | 6 | 9 | 3 | . | 2 |
자리 | -3 | -2 | -1 | 0 | 1 |
SELECT TRUNC(693.281,1)
FROM DUAL;
EX) 693.281에서 첫 번째 자리 이후 소수점 자리부터 버리고 출력하고 싶은 경우 693.281 → 693가 되어야 합니다.
0의 자리는 소수점 자리이기 때문에 소수점을 기준으로 두고 소수점 이후를 전부 버리고 출력합니다.
숫자 | 6 | 9 | 3 | . | 2 | 8 | 1 |
자리 | -3 | -2 | -1 | 0 | 1 | 2 | 3 |
▼
숫자 | 6 | 9 | 3 | . |
자리 | -3 | -2 | -1 | 0 |
SELECT TRUNC(693.281,0)
FROM DUAL;
SELECT TRUNC(693.281)
FROM DUAL;
TRUNC(숫자, 0)의 결과는 TRUNC(숫자)의 결과는 동일합니다. (TRUNC의 디폴트가 0)
EX) 693.281에서 십의 자리 이후 일의 자리부터 버리고 출력하고 싶은 경우 693.281 → 690가 되어야 합니다
숫자 | 6 | 9 | 3 | . | 2 | 8 | 1 |
자리 | -3 | -2 | -1 | 0 | 1 | 2 | 3 |
▼
숫자 | 6 | 9 | 0 |
자리 | -3 | -2 | -1 |
SELECT TRUNC(693.281,-1)
FROM DUAL;
Q. 876.567 숫자를 출력하라. 단 소수점 두 번째 자리인 6과 그 이후의 숫자들은 모두 버리고 출력하라
소수점 주 번째 자리부터 버리고 소수점 첫 번째 자리까지 남기기 때문에 함수 안에 들어갈 자리 수는 1이다.
SELECT TRUNC(876.567,1)
FROM DUAL;

025 나눈 나머지 값 출력하기 (MOD)
숫자 값을 나눈 나머지의 값을 출력할 때 MOD 함수를 사용합니다.
SELECT MOD(나눠지는 수, 나누는 수)
FROM DUAL;
EX) 15를 4로 나눈 나머지의 값을 출력하라
SELECT MOD(15,4)
FROM DUAL;

Q. 숫자 10을 3으로 나눈 나머지 값을 출력하라
나누는 수 = 3, 나누어지는 수 =10
SELECT MOD(10,3)
FROM DUAL;

Q. 사원 번호와 사원 번호가 홀수이면 1, 짝수이면 0을 출력하라.
홀수는 2로 나누었을 때 나머지가 1, 짝수는 나머지가 0인 점을 이용하여 계산한다.
SELECT EMPNO, MOD(EMPNO,2)
FROM EMP;

Q. 사원번호가 짝수인 사원들의 사원 번호와 이름을 출력하라.
WHERE 절을 활용하여 사원번호를 2로 나누었을 때 나머지가 0인 사원번호와 사원 이름을 출력하면 된다.
SELECT EMPNO, ENAME
FROM EMP
WHERE MOD(EMPNO,2) = 0;

나머지를 구하는 함수가 MOD 함수라면 나눈 몫을 구하는 FLOOR 함수가 있습니다.
SELECT FLOOR(나눠지는 수 / 나누는 수)
FROM DUAL;
EX) 15를 4로 나눈 몫을 출력하라
SELECT FLOOR(15 / 4)
FROM DUAL;


15를 나눈 값은 3.75이지만 FLOOR 함수는 3과 4 사이에서의 제일 바닥에 해당하는 값인 3을 출력합니다.
Q. 숫자 10을 3으로 나눈 몫을 출력하라
SELECT FLOOR(10 / 3)
FROM DUAL;

026 날짜 간 개월 수 출력하기 (MONTHS_BETWEEN)
날짜와 날짜 사이의 개월 수를 출력할 때 MONTHS_BETWEEN 함수를 사용합니다.
SELECT MONTHS_BETWEEN('날짜1', '날짜2')
'날짜 1'과 '날짜 2'에는 날짜 값을 입력받아 숫자 값을 출력합니다. MONTHS_BETWEEN 함수에 날짜 값을 입력할 때 '날짜 1' 자리에는 최신의 날짜를, '날짜 2'에는 예전 날짜로 입력해야 합니다. 즉 '날짜 1'이 '날짜 2' 보다 최신이어야 합니다.
EX ) 2019년 9월 1일에서 2021년 6월 30일 사이의 개월 수를 출력하시오.
SELECT MONTHS_BETWEEN('2021-06-30','2019-09-30') AS MONTH_BTEWEEN
FROM DUAL;

Q. 사원의 이름과 입사한 날짜부터 오늘 총 몇 달을 근무했는지 출력하라.
※ 오늘 날짜를 출력하는 함수는 SYSDATE 함수입니다.
SELECT ENAME, ROUND(MONTHS_BETWEEN(SYSDATE, HIREDATE),4) AS 근무
FROM EMP;
SYSDATE는 오늘 날짜를 확인하는 함수로 2021년 6월 29일을 기준으로 출력된 결과입니다.
소수점 밑에 자리 숫자가 길어 넷째 자리까지 만을 출력하여 이를 근무라는 별칭을 두었습니다.

MONTHS_BETWEEN 함수를 이용하지 않고 날짜만으로 연산을 해야 할 경우 다음과 같이 날짜와 산술 연산만을 이용하여 산술식을 작성해야 합니다.
SELECT TO_DATE('날짜1', '날짜 형식') - TO_DATE('날짜2', '날짜 형식')
FROM DUAL;
날짜 형식은 지난 008번 연습문제를 참고하면 좀 더 자세히 알 수 있습니다.
[SQL] PART1 - 02 초보자를 위한 SQL 200제 문제풀이 (005-009)
- 이 글은 도서 '초보자를 위한 SQL 200제'라는 책을 바탕으로 작성되었습니다. - 들어가기에 앞서 SQL의 종류에 대한 글을 선행하고 오시는 걸 추천드립니다 [SQL] SQL의 종류 - DDL, DML,DCL SQL은 구조화
seoyuun22.tistory.com
EX) 2019년 6월 1일에서 2021년 6월 30일 사이의 총일수를 출력하라
2019년 6월 1일에서 2021년 6월 30일 사이의 총일수를 출력하려면 최신인 날짜 2021년 6월 30일부터 작성합니다.
SELECT TO_DATE('2021-06-30','YYYY-MM-DD') - TO_DATE('2019-06-01','YYYY-MM-DD') AS 날짜계산
FROM DUAL;

Q. 2018년 10월 1일에서 2019년 6월 1일 사이의 총일수를 출력하라.
SELECT TO_DATE('2018-10-01','YYYY-MM-DD') - TO_DATE('2019-06-01','YYYY-MM-DD')
FROM DUAL;

위에서 구한 일수를 이용하여 총 주(Week) 수를 구할 수 있습니다. 총일수를 구한 후, 구한 값을 7로 나누어 반올림하면 총주수를 구할 수 있습니다.
SELECT ROUND((TO_DATE('날짜1', '날짜 형식') - TO_DATE('날짜2', '날짜 형식')) / 7)
FROM DUAL;
EX) 2019년 6월 1일에서 2021년 6월 30일 사이의 총주수를 출력하라
2019년 6월 1일에서 2021년 6월 30일 사이의 총주수를 출력하려면 최신인 날짜 2021년 6월 30일부터 작성합니다.
SELECT ROUND((TO_DATE('2021-06-30', 'YYYY-MM-DD') - TO_DATE('2019-06-01', 'YYYY-MM-DD')) / 7) AS 총_주수
FROM DUAL;

Q. 2018년 10월 1일에서 2019년 6월 1일 사이의 총 주(Week) 수를 출력하라.
SELECT ROUND((TO_DATE('2019-06-01', 'YYYY-MM-DD') - TO_DATE('2018-10-01', 'YYYY-MM-DD')) / 7) AS 총_주수
FROM DUAL;

027 개월 수 더한 날짜 출력하기 (ADD_MONTHS)
특정 날짜에서 개월 수를 더한 날짜를 출력할 때 ADD_MONTHS 함수를 사용합니다.
SELECT ADD_MONTHS(TO_DATE('날짜','날짜 형식'), 더할 개월 수)
FROM DUAL;
EX) 2021년 6월 1일부터 40달 뒤의 날짜는 어떻게 되는지 출력하라
SELECT ADD_MONTHS(TO_DATE('2021-06-01','YYYY-MM-DD'), 40)
FROM DUAL;

Q. 2019년 5월 1일로부터 100달 뒤의 날짜는 어떻게 되는지 출력하라.
SELECT ADD_MONTHS(TO_DATE('2019-05-01','YYYY-MM-DD'), 100)
FROM DUAL;

만약 더하는 기준이 달(MONTH)이 아닌 일(DAY)인 경우 일반적인 날짜형 TO_DATE의 값에 숫자를 더해주면 더한 숫자만큼의 일수 이후의 날짜를 출력한다.
SELECT TO_DATE('날짜','날짜 형식') + 숫자
FROM DUAL;
EX ) 2021년 12월 25일로부터 100일 전 날짜는 어떻게 되는지 출력하라.
SELECT TO_DATE('2021-12-25','RRRR-MM-DD') - 100
FROM DUAL;

빼기(-) 연산을 통해 21년 12월 25일로부터 100일 전은 21년 9월 16일임을 확인할 수 있다.
Q. 2019년 5월 1일로부터 100일 후에 돌아오는 날짜는 어떻게 되는지 출력하라.
SELECT TO_DATE('2019-05-01','RRRR-MM-DD') + 100
FROM DUAL;

028 특정 날짜 뒤에 오는 요일 날짜 출력하기 (NEXT_DAY)
특정 날짜 다음에 돌아오는 특정 요일의 날짜를 출력하기 위해서는 NEXT_DAY 함수를 사용합니다.
SELECT NEXT_DAY('날짜', '요일')
FROM DUAL;
EX ) 2021년 6월 30일로부터 바로 돌아올 화요일의 날짜가 어떻게 되는지 출력하라
SELECT '21-06-30' AS 날짜, NEXT_DAY('21-06-30', '화요일')
FROM DUAL;


달력을 통해서 6월 30일로부터 바로 돌아오는 화요일은 7월 6월임을 확인할 수 있습니다.
Q. 2019년 5월 22일로부터 바로 돌아올 월요일의 날짜가 어떻게 되는지 출력하라
SELECT '19-05-22' AS 날짜, NEXT_DAY('19-05-22', '월요일')
FROM DUAL;

Q. 오늘부터 앞으로 돌아올 화요일의 날짜를 출력하라
오늘 날짜를 나타내는 함수 SYSDATE를 이용하여 출력합니다.
SELECT SYSDATE, NEXT_DAY(SYSDATE, '화요일')
FROM DUAL;

NEXT_DAY 함수의 경우 중첩해서 사용이 가능합니다. 예를 들어 앞에서 배웠던 개월 수를 더한 날짜를 출력했던 ADD_MONTHS 함수와 함께 사용한 예제를 풀어보겠습니다.
EX ) 2021년 6월 29일로부터 3달 뒤에 돌아오는 월요일의 날짜를 출력하라
먼저 2021년 6월 29일로부터 3달이 지난 날짜를 출력해야 합니다. → ADD_MONTH('2021-06-20', 3)
위에서 구한 날짜로부터 요일을 구해야 합니다 → NEXT_DAY(ADD_MONTH('2021-06-20', 3), '월요일')
이를 바탕으로 SQL을 작성하면 다음과 같습니다.
SELECT NEXT_DAY(ADD_MONTHS('2021-06-29', 3), '월요일')
FROM DUAL;

Q. 2019년 5월 22일부터 100달 뒤에 돌아오는 화요일의 날짜를 출력하라
먼저 2019년 5월 22일로부터 100달이 지난 날짜를 출력해야 합니다. → ADD_MONTH('2019-05-22', 100)
위에서 구한 날짜로부터 요일을 구해야 합니다 → NEXT_DAY(ADD_MONTHS('2019-05-22', 3), '화요일')
SELECT NEXT_DAY(ADD_MONTHS('2019-05-22', 100), '화요일')
FROM DUAL;

Q. 오늘로부터 100달 뒤에 돌아오는 월요일의 날짜 출력
먼저 오늘로부터 100달이 지난 날짜를 출력해야 합니다. → ADD_MONTH(SYSDATE, 100)
위에서 구한 날짜로부터 요일을 구해야 합니다 → NEXT_DAY(ADD_MONTHS(SYSDATE, 3), '월요일')
SELECT NEXT_DAY(ADD_MONTHS(SYSDATE, 3), '월요일')
FROM DUAL;

029 특정 날짜가 있는 달의 마지막 날짜 출력하기 (LAST_DAY)
특정 날짜가 있는 달의 마지막 날짜를 출력할 때 LAST_DAY 함수를 사용합니다.
SELECT LAST_DAY('DATE')
FROM DUAL;
EX) 2021년 4월 13일 해당 달의 마지막 날짜가 어떻게 되는지 출력하라
SELECT '21/04/13' AS 날짜 , LAST_DAY('2021/04/13') AS 마지막날짜
FROM DUAL;

Q. 2019년 5월 22일 해당 달의 마지막 날짜가 어떻게 되는지 출력하라
SELECT '19/05/22' AS 날짜 , LAST_DAY('19/05/22') AS 마지막날짜
FROM DUAL;

Q. 오늘부터 이번 달 말일까지 총 며칠 남았는지 출력하라
오늘 날짜를 나타내는 함수 SYSDATE ( =21년 6월 29일) 기준으로 결과를 출력한다
SELECT LAST_DAY(SYSDATE) - SYSDATE
FROM DUAL;

Q. 이름이 KING인 사원의 이름, 입사일, 입사한 달의 마지막 날짜를 출력하라
WHERE 절을 이용하여 이름이 KING인 사원만의 정보를 출력합니다.
SELECT ENAME, HIREDATE, LAST_DAY(HIREDATE)
FROM EMP
WHERE ENAME = 'KING';
