빅데이터/SQL

날짜 연산(INTERVAL type etc)

예캉 2017. 12. 29. 13:58
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
-- 날짜 연산
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-RR HH:MI:SS [AM]';
 
SELECT SYSDATE - DATE '2001-04-13'
FROM dual;
 
SELECT SYSDATE,SYSDATE+1
FROM dual;
 
SELECT SYSDATE,SYSDATE+6
FROM dual;
 
SELECT SYSDATE, SYSDATE - 30/(24*60FROM dual; -- 분
 
SELECT SYSDATE, SYSDATE + 2/24 + 11/24/60 + 22/24/60/60 FROM dual;
 
 
 
-- INTERVAL type
-- 1) YEAR TO MONTH
-- 2) DAY TO SECOND
 
SELECT INTERVAL '2-03' YEAR TO MONTH
    , INTERVAL '1 2:3:4' DAY TO SECOND
FROM dual;
 
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS';
 
SELECT SYSDATE
     , SYSDATE + INTERVAL '2-03' YEAR TO MONTH
     , SYSDATE + INTERVAL '1 2:3:4' DAY TO SECOND
FROM dual;
 
 
-- 현재 시간에서 2시간 11분 22초 후를 INTERVAL로 구하면?
SELECT SYSDATE
     , SYSDATE + INTERVAL '0 2:11:22' DAY TO SECOND
FROM dual;
 
SELECT SYSDATE
     , SYSDATE + INTERVAL '2:11:22' HOUR TO SECOND
FROM dual;
 
-- 현재 시간에서 이틀 전은?
SELECT SYSDATE
     , SYSDATE - INTERVAL '2' DAY
FROM dual;
 
SELECT SYSDATE
     , SYSDATE + INTERVAL '1:2' HOUR TO MINUTE
     , SYSDATE + INTERVAL '-1:2' MINUTE TO SECOND
     , SYSDATE + INTERVAL '1:2' MINUTE TO SECOND
FROM dual;
 
SELECT SYSDATE
     , SYSDATE + INTERVAL '1' YEAR
     , SYSDATE + INTERVAL '1' MONTH
FROM dual;
 
-- YEAR, DAY의 크기!!!!!!!!!!!!!
-- 기본값은 둘 다 2자리!!!!!!!!!!!!!!!!!
 
SELECT INTERVAL '100' YEAR FROM daul; -- 오류가 난다.
 
SELECT INTERVAL '100' YEAR(3FROM dual;
 
SELECT INTERVAL '100' DAY FROM dual; -- 오류가 난다.
 
SELECT INTERVAL '100' DAY(3FROM dual; 
 
SELECT INTERVAL '100 3' DAY(3) TO HOUR FROM dual;
 
SELECT INTERVAL '100' MONTH FROM dual;
SELECT INTERVAL '1-12' YEAR TO MONTH FROM dual; -- 에러가 난다. 1년 ~개월할때 ~는 11까지만 가능하다.
--마찬가지로 하루 25시간도 안된다.
 
SELECT INTERVAL '2-0' YEAR TO MONTH FROM dual;
 
SELECT INTERVAL '2' YEAR FROM dual;
 
 
-- 1998년 3월에 입사한 사원들의 이름과 입사일을 출력하세요
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-RR';
ALTER SESSION SET NLS_LANGUAGE = 'american';
-- 내 코드
SELECT last_name, hire_date, LAST_DAY(HIRE_DATE)
FROM employees
WHERE LAST_DAY(HIRE_DATE)='31-MAR-98';
-- 강사님 코드 1
SELECT last_name, hire_date
FROM employees
WHERE hire_date BETWEEN '01-march-98' AND '31-MAR-1998';
-- 강사님 코드 2
SELECT last_name, hire_date
FROM employees
WHERE hire_date >= '01-march-98' 
  AND hire_date < '01-APR-1998';
-- 강사님 코드 3
SELECT last_name, hire_date
FROM employees
WHERE hire_date BETWEEN '01-march-98' AND LAST_DAY('01-MAR-98');
 
-- next day
SELECT NEXT_DAY(DATE '2001-04-13','SAT'FROM dual;
 
-- 문제) last_name 의 길이가 5인 사원의 이름과 직무, 급여를 출력하세요.
SELECT last_name, job_id, salary, LENGTH(last_name) 
FROM employees
WHERE LENGTH(last_name)=5;
 
-- like 
-- last_name LIKE '_____';
cs


<날짜 조작 함수>

MONTH_BETWEEN : 두 날짜 간의 월 수

ADD_MONTHS : 날짜에 월 추가

NEXT_DAY : 지정된 날짜의 다음 날

LAST_DAY : 월의 마지막 날

ROUND : 날짜 반올림

TRUNC : 날짜 truncate