본문 바로가기

SQL/SQL 예제

[SQL] Part2 날짜형 데이터

반응형

초보자를 위한 SQL 200제의 문제를 바탕으로 작성되었습니다.


 

 

 

 

<날짜형 함수 정리>

함수 기능
MONTHS_BETWEEN 날짜와 날짜 사이의 개월 수를 출력
ADD_MONTHS 특정 날자에서 개월 수를 더한 날짜 출력
NEXT_DAY 특정 날짜 다음에 돌아오는 날짜 출력
LAST_DAY 특정 날짜가 있는 달의 마지막 날짜 출력
TO_CHAR 날짜형, 숫자형 데이터를 문자형 데이터로 변환
TO_DATE 문자를 날짜형으로 변환

 

 

 

 

 

[예제26]

1. 이름을 출력하고 입사한 날짜부터 오늘까지 총 몇달을 근무했는지 출력

select ename, months_between(sysdate, hiredate) as 날짜
    from emp;

  • sysdate: 오늘 날짜 확인하는 함수
  • MONTHS_BETWEEN(최신 날짜, 예전 날짜)로 입력

 

 

 

 

[예제27] 

1. 2019년 5월 1일로부터 100달 뒤의 날짜 출력

select add_months(to_date('2019-05-01', 'yyyy-mm-dd'), 100)
    from dual;

  • TO_DATE(날짜, 형식): 주어진 문자열 또는 컬럼의 데이터를 날자 포맷으로 변환해 주는 형변환 함수
  • ADD_MONTHS(기준 날짜, 더할 개월수)

 

 

2.  2019년 5월 1일로부터 100일 후의 날짜 출력

select to_date('2019-05-01', 'yyyy-mm-dd') + 100
    from dual;

 

 

3. day기준이 아닌 months 기준일 경우

select to_date('2019-05-01','yyyy-mm-dd') + interval '100' month
    from dual;

  • interval : 섬세한 날짜 산술 연산을 가능하게 함.
    • 달의 기준을 30일로 해야 할지 31일로 해야 할지 정하기 어렵기 때문에 사용.
    • interval은 year, month, day, hour, minute, second까지 다양한 옵션이 있음 

 

 

4. 2019년 5월 1일부터 3년 5개월 후의 날짜 출력

select to_date('2019-05-01', 'yyyy-mm-dd') + to_yminterval('03-05') as 날짜
    from dual;

  • TO_TMINTERVAL('year - month')로 표현

 

 

 

 

[예제28] 

1. 오늘부터 앞으로 돌아올 월요일의 날짜가 어떻게 되는지 출력

select sysdate as 오늘, next_day(sysdate, '월요일') 
    from dual;

 

 

 

2. 오늘부터 100달 뒤에 돌아오는 월요일 날짜 출력

select sysdate as 오늘, next_day(add_months(sysdate, 100), '월요일') as 다음날짜
    from dual;

 

 

 

[예제29]

1. 특정 날짜의 마지막 날짜 출력

select '2019-05-22' as 날짜, last_day('2019-05-22') as "마지막 날짜"
	from dual;

  • LAST_DAY('특정 날짜') : 특정 날짜의 마지막 날짜 출력

 

 

2. 오늘부터 이번달 말일까지 총 몇일 남았는지 출력

select sysdate as 오늘, last_day(sysdate) - sysdate as 남은날짜
	from dual;

 

 

 

[예제30]

1. 이름이 SCOTT인 사원의 이름과 입사한 요일, 월급을 천 단위로 구분하여 출력

select ename, to_char(hiredate, 'day') as 요일, to_char(sal, '999,999') as 월급
    from emp
    where ename = 'SCOTT';

  • TO_CHAR: 숫자형 데이터를 문자형으로 변환하거나 날짜형 데이터를 문자형으로 변환할때 사용.
  • 날짜를 문자로 출력할 때 사용할 수 있는 포맷은 다음과 같음.
연도 RRRR, YYYY, RR, YY WW, IW, W
MM, MON 시간 HH, HH24
DD MI
요일 DAY, DY SS
  • 연도에서 'RR' 포맷과 'YY'포맷은 서로 다름. (RRRR과 YYYY의 경우 차이 없음)
    • 'YY'는 2000년대를 나타내며, 'RR'은 1900년도를 포함함.
    • 'RR'을 조금 더 자세히 표현하면 50년을 기준으로 50년 이상이면 1900년대, 미만이면 2000년대를 나타냄.
  • 월급을 천 단위로 표시할 때, 숫자 9는 자릿수이고 이 자리에 0~9까지 어떠한 숫자가 와도 관계 없다는 뜻.

 

 

2. 날짜에서 년, 월, 일, 요일 출력하기

select hiredate, to_char(hiredate, 'rrrr') as 연도, to_char(hiredate, 'mm') as 월, to_char(hiredate, 'dd') as 일, to_char(hiredate, 'day') as 요일
    from emp
    where ename = 'SCOTT';

 

3. 날짜 컬럼에서 연도/ 월/ 일/ 시간/ 분/ 초를 추출하기  위해 EXTRACT 함수를 사용하는 경우

select ename as 이름, extract(year from hiredate) as 연도,
                     extract(month from hiredate) as 달,
                     extract(day from hiredate) as 요일
    from emp
    where ename = 'SCOTT';

 

 

[예제 31]

1. 81년 11월 17일에 입사한 사원의 이름과 입사일 출력

select ename, hiredate
    from emp
    where hiredate = to_date('81/11/17', 'rr/mm/dd');

  • TO_DATE: 문자를 날짜형으로 변환하여 출력
    • 날짜형 데이터를 검색할 때 에러 발생을 막으려면 사용할 테이블의 날짜 형식을 확인해야 함.
    • 만약 사용하는 테이블마다 형식이 다른 경우 일관된 검색이 불가능하게 되어 쿼리가 복잡해짐. 
    • 해당 상황에서 일관된 날짜 검색할 수 있게 해주는 함수가 TO_DATE.

 

 

 

 

 

 

 

 

 

 

 

반응형

'SQL > SQL 예제' 카테고리의 다른 글

[SQL] Part2 DECODE, CASE (IF문 )  (0) 2022.08.09
[SQL] Part2 NVL, NVL2 (NULL 값 처리)  (0) 2022.08.09
[SQL] 암시적 형 변환  (0) 2022.08.09
[SQL] Part2 문자열  (0) 2022.08.07
[SQL] 비교연산자  (0) 2022.08.07