포스팅 목차
* 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
[ TO_DSINTERVAL Oracle Function ]
TO_DSINTERVAL 함수는 문자형 데이터 형식의 문자열을 INTERVAL DAY TO SECOND 타입(날짜-시간 구간 형식)으로 변환한다. 특정 날짜/시간을 기준으로 특정 기간(날짜 및 시간)이 경과된 날짜/시간을 반환한다.
이 함수에 지정할수 있는 유효한 nlsparam은 NLS_NUMERIC_CHARACTERS이다. 이 인수 형태는 다음과 같다. NLS_NUMERIC_CHARACTERS = “dg” where d 와 g는 소수점 문자와 자리수 단락 을 나타낸다.
- 함수설명 : TO_DSINTERVAL 오라클 함수 링크
- NUMTODSINTERVAL 함수 : NUMTODSINTERVAL 오라클 함수 링크
1. Oracle(오라클)
TO_DSINTERVAL() 함수
TO_DSINTERVAL() 함수를 사용하여서 2020년 3월 20일을 기준으로 50일 전의 날짜를 계산한다.
Oracle Programming |
SELECT TO_DATE('2020-03-20','YYYY-MM-DD') - TO_DSINTERVAL('50 00:00:00') BEFORE
FROM DUAL
Results |
BEFORE
-------------------------
30-JAN-2020 00:00:00
2. Python Pandas(파이썬)
pd.DateOffset() 함수
2020년 3월 20일 자정을 기준으로 50일 전 자정에서 10시간 30초가 경과된 날짜/시간을 계산한다.
Python Programming |
pd.to_datetime('2020-03-20 00:00:00.0') - pd.DateOffset(days=50)+ pd.DateOffset(hours=10)+ pd.DateOffset(second=30)
Results |
Timestamp('2020-01-30 10:00:30')
3. R Programming (R Package)
%m-% 와 %m+%
2020년 3월 20일 새벽 1시를 기준으로 50일 전 새벽 1시에서 10시간 30초가 경과된 날짜/시간을 계산한다.
R Programming |
%%R
ymd_hms("2020-03-20 01:00:00.0") %m-% days(50) %m+% hours(10) %m+% seconds(30)
Results |
[1] "2020-01-30 11:00:30 UTC"
4. R Dplyr Package
%m-% 와 %m+%
개별 사원의 입사일을 기준으로 5개월이 경과된 날짜를 반환한다.
R Programming |
%%R
emp %>%
dplyr::mutate(add_date = as.Date(hiredate) %m+% months(5)) %>%
head()
Results |
# A tibble: 6 x 9
empno ename job mgr hiredate sal comm deptno add_date
<dbl> <chr> <chr> <dbl> <date> <dbl> <dbl> <dbl> <date>
1 7369 SMITH CLERK 7902 1980-12-17 800 NA 20 1981-05-17
2 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 1981-07-20
3 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30 1981-07-22
4 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20 1981-09-02
5 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 1982-02-28
6 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30 1981-08-01
5. R sqldf Package
datetime() 함수와 '+' / '-' 인수
기준 날짜/시간을 기준으로 지정한 인수가 경과된 날짜/시간을 반환환다.
R Programming |
%%R
sqldf(" select datetime('2020-03-20 01:00:00.0', '+' || 2 || ' year') yy,
datetime('2020-03-20 01:00:00.0', '+' || 2 || ' month') mm,
datetime('2020-03-20 01:00:00.0', '-' || 50 || ' day') dd,
datetime('2020-03-20 01:00:00.0', '+' || 2 || ' hour') hh,
datetime('2020-03-20 01:00:00.0', '+' || 2 || ' minute') mi,
datetime('2020-03-20 01:00:00.0', '+' || 2 || ' second') ss ")
Results |
yy mm dd
1 2010-03-20 01:00:00 2008-05-20 01:00:00 2008-01-30 01:00:00
hh mi ss
1 2008-03-20 03:00:00 2008-03-20 01:02:00 2008-03-20 01:00:02
datetime() 함수와 '+' / '-' 인수
2020년 3월 20일 새벽 1시를 기준으로 50일 전 새벽 1시에서 10시간 30초가 경과된 날짜/시간을 계산한다.
R Programming |
%%R
sqldf(" select strftime('%Y-%m-%d %H:%M:%f',datetime('2020-03-20 01:00:00.0','-50 days','+10 hours','+30 second')) add_time")
Results |
add_time
1 2020-01-30 11:00:30.000
6. Python pandasql Package
datetime() 함수와 '+' / '-' 인수
Python Programming |
ps.sqldf(" select datetime('2020-03-20 01:00:00.0', '+' || 2 || ' year') yy, \
datetime('2020-03-20 01:00:00.0', '+' || 2 || ' month') mm, \
datetime('2020-03-20 01:00:00.0', '-' || 50 || ' day') dd, \
datetime('2020-03-20 01:00:00.0', '+' || 2 || ' hour') hh, \
datetime('2020-03-20 01:00:00.0', '+' || 2 || ' minute') mi, \
datetime('2020-03-20 01:00:00.0', '+' || 2 || ' second') ss ")
Results |
yy mm dd hh mi ss
0 2022-03-20 01:00:00 2020-05-20 01:00:00 2020-01-30 01:00:00 2020-03-20 03:00:00 2020-03-20 01:02:00 2020-03-20 01:00:02
datetime() 함수와 '+' / '-' 인수
Python Programming |
ps.sqldf(" select strftime('%Y-%m-%d %H:%M:%f',datetime('2020-03-20 01:00:00.0','-50 days','+10 hours','+30 second')) add_time ")
Results |
add_time
0 2020-01-30 11:00:30.000
7. R data.table Package
%m-% 와 %m+%
개별 사원의 입사일을 기준으로 5개월이 경과된 날짜를 반환한다.
R Programming |
%%R
DT <- data.table(emp)
dept_DT <- data.table(dept)
# DT[, .add_date := as.numeric(format( as.Date(hiredate) %m+% months(5) , "%Y%m%d")) ]
DT[, add_date := as.Date(hiredate) %m+% months(5) ][1:10, ]
Results |
empno ename job mgr hiredate sal comm deptno add_date
1: 7369 SMITH CLERK 7902 1980-12-17 800 NA 20 1981-05-17
2: 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 1981-07-20
3: 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30 1981-07-22
4: 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20 1981-09-02
5: 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 1982-02-28
6: 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30 1981-08-01
7: 7782 CLARK MANAGER 7839 1981-01-09 2450 NA 10 1981-06-09
8: 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 20 1983-05-09
9: 7839 KING PRESIDENT NA 1981-11-17 5000 NA 10 1982-04-17
10: 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30 1982-02-08
%m-% 와 %m+%
개별 사원의 입사월 마지막 날짜를 기준으로 5개월이 경과된 날짜를 반환한다. 현재월의 마지막 날짜를 계산하기 위하여 다음 달 초일자(1일)을 계산 후 1일을 빼는 방식을 계산한다.
R Programming |
%%R
DT <- data.table(emp)
dept_DT <- data.table(dept)
# DT[, .add_date := as.numeric(format( (lubridate::ceiling_date(as.Date(hiredate),"month") - 1) %m+% months(5) , "%Y%m%d")) ]
DT[, .add_date := (lubridate::ceiling_date(as.Date(hiredate),"month") - 1) %m+% months(5) ][1:10, ]
Results |
empno ename job mgr hiredate sal comm deptno .add_date
1: 7369 SMITH CLERK 7902 1980-12-17 800 NA 20 1981-05-31
2: 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 1981-07-28
3: 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30 1981-07-28
4: 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20 1981-09-30
5: 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 1982-02-28
6: 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30 1981-08-31
7: 7782 CLARK MANAGER 7839 1981-01-09 2450 NA 10 1981-06-30
8: 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 20 1983-05-31
9: 7839 KING PRESIDENT NA 1981-11-17 5000 NA 10 1982-04-30
10: 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30 1982-02-28
8. Python Duckdb의 SQL
Python Programming |
%%sql
select TIMESTAMP '2020-03-20 01:00:00.0' + INTERVAL 2 YEAR AS YY,
TIMESTAMP '2020-03-20 01:00:00.0' + INTERVAL 2 MONTH AS MM,
TIMESTAMP '2020-03-20 01:00:00.0' + INTERVAL 50 DAY AS DD,
TIMESTAMP '2020-03-20 01:00:00.0' + INTERVAL 2 HOUR AS HH,
TIMESTAMP '2020-03-20 01:00:00.0' + INTERVAL 2 MINUTE AS MI,
TIMESTAMP '2020-03-20 01:00:00.0' + INTERVAL 2 SECOND AS SE,
Python Programming |
duckdb.sql(" select TIMESTAMP '2020-03-20 01:00:00.0' + INTERVAL 2 YEAR AS YY, \
TIMESTAMP '2020-03-20 01:00:00.0' + INTERVAL 2 MONTH AS MM, \
TIMESTAMP '2020-03-20 01:00:00.0' + INTERVAL 50 DAY AS DD, \
TIMESTAMP '2020-03-20 01:00:00.0' + INTERVAL 2 HOUR AS HH, \
TIMESTAMP '2020-03-20 01:00:00.0' + INTERVAL 2 MINUTE AS MI, \
TIMESTAMP '2020-03-20 01:00:00.0' + INTERVAL 2 SECOND AS SE ").df()
Results |
YY MM DD \
0 2022-03-20 01:00:00 2020-05-20 01:00:00 2020-05-09 01:00:00
HH MI SE
0 2020-03-20 03:00:00 2020-03-20 01:02:00 2020-03-20 01:00:02
Python Programming |
%%sql
select strftime(timestamp '2020-03-20 01:00:00.0' - INTERVAL 50 DAY + INTERVAL 10 HOUR + INTERVAL 30 SECOND , '%Y-%m-%d %I:%M:%S') add_time
Python Programming |
duckdb.sql(" select strftime(timestamp '2020-03-20 01:00:00.0' - INTERVAL 50 DAY + INTERVAL 10 HOUR + INTERVAL 30 SECOND , '%Y-%m-%d %I:%M:%S') add_time ").df()
Results |
add_time
0 2020-01-30 11:00:30
--------------------------------------------
[Oracle, Pandas, R Prog, Dplyr, Sqldf, Pandasql, Data.Table] 오라클 함수와 R & Python 비교 사전 목록 링크 |
오라클 SQL 함수(Oracle SQL Function) 목록 리스트 링크 |
[SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE] SQL EMP 예제로 만나는 테이블 데이터 처리 방법 리스트 링크 링크 |
댓글