본문 바로가기
통계프로그램 비교 시리즈/오라클함수 비교(R & Python)

TO_DSINTERVAL 오라클 함수 [Oracle, Pandas, R Prog, Dplyr, Sqldf, Pandasql, Data.Table, DuckDB]

by 기서무나구물 2021. 12. 27.

포스팅 목차

    * 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크


    [ TO_DSINTERVAL Oracle Function ]

     


    TO_DSINTERVAL 함수는 문자형 데이터 형식의 문자열을 INTERVAL DAY TO SECOND 타입(날짜-시간 구간 형식)으로 변환한다. 특정 날짜/시간을 기준으로 특정 기간(날짜 및 시간)이 경과된 날짜/시간을 반환한다.

    이 함수에 지정할수 있는 유효한 nlsparam은 NLS_NUMERIC_CHARACTERS이다. 이 인수 형태는 다음과 같다. NLS_NUMERIC_CHARACTERS = “dg” where d 와 g는 소수점 문자와 자리수 단락 을 나타낸다.

     

     


    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

     

     


    ( https://unsplash.com/photos/BXOXnQ26B7o )

     

      --------------------------------------------  

     

     

    [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 예제로 만나는 테이블 데이터 처리 방법 리스트 링크 링크
    반응형

    댓글