본문 바로가기
통계프로그램 비교 시리즈/프로그래밍비교(Oracle,Python,R,SAS)

[날짜 데이터] 날짜 기간 차이 계산 - 현재 날짜 - 146 (오라클 SQL, R, Python, SAS)

by 기서무나구물 2023. 1. 2.

포스팅 목차

    146. Write query to calculate the length of employee has been with the company?

     

    * 현재 일자를 기준으로 사원별 회사 입사 후 근속 년수를 계산하시오.


    • Oracle : roudn() 함수, sysdate
    • 파이썬 Pandas : assign(), pd.Timestamp.now(), pd.to_datetime(), dt.days
    • R 프로그래밍 : transform(), Sys.Date()
    • R Dplyr Package : dplyr::mutate(), Sys.Date()
    • R sqldf Package : datetime(), strftime(), julianday(), date(), substr()
    • Python pandasql Package : datetime(), strftime(), julianday(), date(), substr()
    • R data.table Package : Sys.Date()
    • SAS Proc SQL : DATDIF 함수, YRDIF 함수, Today()
    • SAS Data Step : DATDIF 함수, YRDIF 함수, Today()
    • Python Dfply Package : pd.Timestamp.now(), make_symbolic(), pd.to_datetime(), dt.days
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    현재 일자를 기준으로 회사 입사일 이후 경과된 근무일자를 계산 후 근속 년수로 환산한다.

     

    Oracle Programming
    Select empno,ename,hiredate,
           round( (sysdate-hiredate)/365) hire_gap
    from   emp;

     


    2. Python Pandas(파이썬)

    현재 일자를 기준으로 회사 입사일 이후 경과된 근무일자를 계산 후 근속 년수로 환산하여 계산 후 assign() 함수를 사용하여 신규 변수 ‘hire_gap’를 생성한다.

     

    Python Programming
    emp.assign(hire_gap = (pd.Timestamp.now() - pd.to_datetime(emp['hiredate'])).dt.days /365 ).head() 

     


    Results
      empno ename job mgr hiredate sal comm deptno hire_gap
    0 7369 SMITH CLERK 7902.0 1980/12/17 800 NaN 20 40.312329
    1 7499 ALLEN SALESMAN 7698.0 1981/02/20 1600 300.0 30 40.134247
    2 7521 WARD SALESMAN 7698.0 1981/02/22 1250 500.0 30 40.128767
    3 7566 JONES MANAGER 7839.0 1981/04/02 2975 NaN 20 40.021918
    4 7654 MARTIN SALESMAN 7698.0 1981/09/28 1250 1400.0 30 39.531507

     


    3. R Programming (R Package)

    현재 일자를 기준으로 회사 입사일 이후 경과된 근무일자를 계산 후 근속 년수로 환산하여 계산 후 transform() 함수를 사용하여 신규 변수 ‘hire_gap’를 생성한다.

     

    R Programming
    %%R
    
    withmooc <- transform(emp, hire_gap = (Sys.Date() - hiredate) / 365)
    withmooc[1:7, ]

     

    Results
      empno  ename      job  mgr   hiredate  sal comm deptno      hire_gap
    1  7369  SMITH    CLERK 7902 1980-12-17  800   NA     20 40.31233 days
    2  7499  ALLEN SALESMAN 7698 1981-02-20 1600  300     30 40.13425 days
    3  7521   WARD SALESMAN 7698 1981-02-22 1250  500     30 40.12877 days
    4  7566  JONES  MANAGER 7839 1981-04-02 2975   NA     20 40.02192 days
    5  7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400     30 39.53151 days
    6  7698  BLAKE  MANAGER 7839 1981-03-01 2850   NA     30 40.10959 days
    7  7782  CLARK  MANAGER 7839 1981-01-09 2450   NA     10 40.24932 days

     


    4. R Dplyr Package

    현재 일자를 기준으로 회사 입사일 이후 경과된 근무일자를 계산 후 근속 년수로 환산하여 계산 후 dplyr::mutate() 함수를 사용하여 신규 변수 ‘hire_gap’를 생성한다.

     

    R Programming
    %%R
    
    emp %>% 
      dplyr::mutate( hire_gap = (Sys.Date() - hiredate) / 365 ) %>%
      head(7)

     

    Results
    # A tibble: 7 x 9
      empno ename  job        mgr hiredate     sal  comm deptno hire_gap     
      <dbl> <chr>  <chr>    <dbl> <date>     <dbl> <dbl>  <dbl> <drtn>       
    1  7369 SMITH  CLERK     7902 1980-12-17   800    NA     20 40.34521 days
    2  7499 ALLEN  SALESMAN  7698 1981-02-20  1600   300     30 40.16712 days
    3  7521 WARD   SALESMAN  7698 1981-02-22  1250   500     30 40.16164 days
    4  7566 JONES  MANAGER   7839 1981-04-02  2975    NA     20 40.05479 days
    5  7654 MARTIN SALESMAN  7698 1981-09-28  1250  1400     30 39.56438 days
    6  7698 BLAKE  MANAGER   7839 1981-03-01  2850    NA     30 40.14247 days
    7  7782 CLARK  MANAGER   7839 1981-01-09  2450    NA     10 40.28219 days

     


    5. R sqldf Package

    현재 일자를 기준으로 회사 입사일 이후 경과된 근무일자를 계산 후 근속 년수로 환산한다. 경과일자를 계산하기 위하여 julianday 함수로 경과일자를 계산 후 근속년수로 환산한다.

    • 날짜 관련 문제 : 74 / 135 / 146번
    • julianday : 74번(http://statwith.com/emp-example-sql-r-python-74/)
    • 정확한 날짜 계산을 위하여 julianday 함수를 사용하여 일자 사이의 차이를 계산하여 근속년수를 환산한다.
    • hire_gap2 변수는년도를 기준으로 근속년수를 산정하여서 일부 직원의 근속년수는 차이가 발생한다.
    R Programming
    %%R
    
    sqldf("select empno,ename,hiredate,
                  datetime('now','localtime') now_date, 
                  strftime('%d-%m-%Y', 'now') now_char,
                  (julianday('now','localtime') - julianday(datetime(hiredate * 3600 * 24,'unixepoch'))) / 365 hire_gap,
                  (date('now','localtime') - datetime(hiredate * 3600 * 24,'unixepoch'))                       hire_gap2
           from emp") %>% head(7)

     

    Results
       empno  ename   hiredate            now_date   now_char hire_gap hire_gap2
    1   7369  SMITH 1980-12-17 2021-04-12 00:13:43 11-04-2021 40.34523        41
    2   7499  ALLEN 1981-02-20 2021-04-12 00:13:43 11-04-2021 40.16715        40
    3   7521   WARD 1981-02-22 2021-04-12 00:13:43 11-04-2021 40.16167        40
    4   7566  JONES 1981-04-02 2021-04-12 00:13:43 11-04-2021 40.05482        40
    5   7654 MARTIN 1981-09-28 2021-04-12 00:13:43 11-04-2021 39.56441        40
    6   7698  BLAKE 1981-03-01 2021-04-12 00:13:43 11-04-2021 40.14249        40
    7   7782  CLARK 1981-01-09 2021-04-12 00:13:43 11-04-2021 40.28222        40
    8   7788  SCOTT 1982-12-09 2021-04-12 00:13:43 11-04-2021 38.36715        39
    9   7839   KING 1981-11-17 2021-04-12 00:13:43 11-04-2021 39.42742        40
    10  7844 TURNER 1981-09-08 2021-04-12 00:13:43 11-04-2021 39.61920        40
    11  7876  ADAMS 1983-01-12 2021-04-12 00:13:43 11-04-2021 38.27400        38
    12  7900  JAMES 1981-12-03 2021-04-12 00:13:43 11-04-2021 39.38359        40
    13  7902   FORD 1981-12-03 2021-04-12 00:13:43 11-04-2021 39.38359        40
    14  7934 MILLER 1982-01-23 2021-04-12 00:13:43 11-04-2021 39.24386        39

     


    6. Python pandasql Package

    현재 일자를 기준으로 회사 입사일 이후 경과된 근무일자를 계산 후 근속 년수로 환산한다.

     

    Python Programming
    ps.sqldf(" select ( julianday(date('now')) -                                                                                                                    \
                                     julianday(substr(hiredate,1,4)||'-'||substr(hiredate,6,2)||'-'||substr(hiredate,9,2)   ) )/365  gap_float,                     \
                      (strftime('%s','now') - strftime('%s',(substr(hiredate,1,4)||'-'||substr(hiredate,6,2)||'-'||substr(hiredate,9,2))))/60/60/24 /365 second_int \
                from emp ").head(7)

     


    Results
      gap_float second_int
    0 40.342466 40
    1 40.164384 40
    2 40.158904 40
    3 40.052055 40
    4 39.561644 39
    5 40.139726 40
    6 40.279452 40

     


    7. R data.table Package

    현재 일자를 기준으로 회사 입사일 이후 경과된 근무일자를 계산 후 근속 년수로 환산하여 계산 후 신규 변수 ‘hire_gap’으로 생성한다.

     

    R Programming
    %%R
    
    DT          <- data.table(emp)
    
    DT[, hire_gap := (Sys.Date() - hiredate) / 365,][1:7, ]

     

    Results
       empno  ename      job  mgr   hiredate  sal comm deptno      hire_gap
    1:  7369  SMITH    CLERK 7902 1980-12-17  800   NA     20 40.36164 days
    2:  7499  ALLEN SALESMAN 7698 1981-02-20 1600  300     30 40.18356 days
    3:  7521   WARD SALESMAN 7698 1981-02-22 1250  500     30 40.17808 days
    4:  7566  JONES  MANAGER 7839 1981-04-02 2975   NA     20 40.07123 days
    5:  7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400     30 39.58082 days
    6:  7698  BLAKE  MANAGER 7839 1981-03-01 2850   NA     30 40.15890 days
    7:  7782  CLARK  MANAGER 7839 1981-01-09 2450   NA     10 40.29863 days

     


    8. SAS Proc SQL

     

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        Select empno,hiredate,
               DATDIF(hiredate, TODAY(), 'ACT/ACT') / 365 as hire_gap,
               YRDIF(hiredate,  TODAY(), 'ACT/ACT')       as hire_gap2
        from   emp;
    QUIT;
    PROC PRINT data=STATSAS_1(obs=5);RUN;

     


    Results
    OBS empno hiredate hire_gap hire_gap2
    1 7369 1980-12-17 40.3616 40.3341
    2 7499 1981-02-20 40.1836 40.1562
    3 7521 1981-02-22 40.1781 40.1507
    4 7566 1981-04-02 40.0712 40.0438
    5 7654 1981-09-28 39.5808 39.5534

     


    9. SAS Data Step

     

    SAS Programming
    %%SAS sas
    
    DATA STATSAS_2;
     set emp;
         hire_gap  = DATDIF(hiredate, TODAY(), 'ACT/ACT') / 365;
         hire_gap2 = YRDIF(hiredate,  TODAY(), 'ACT/ACT');
         KEEP EMPNO hiredate HIRE_: ;
    RUN;
    PROC PRINT data=STATSAS_2(obs=5);RUN;

     


    Results
    OBS empno hiredate hire_gap hire_gap2
    1 7369 1980-12-17 40.3616 40.3341
    2 7499 1981-02-20 40.1836 40.1562
    3 7521 1981-02-22 40.1781 40.1507
    4 7566 1981-04-02 40.0712 40.0438
    5 7654 1981-09-28 39.5808 39.5534

     


    10. Python Dfply Package

     

    Python Programming
    emp >> \
      mutate( hire_gap = (pd.Timestamp.now() - make_symbolic(pd.to_datetime)(X.hiredate)).dt.days /365 ) >> \
      head()

     


    Results
      empno ename job mgr hiredate sal comm deptno hire_gap
    0 7369 SMITH CLERK 7902.0 1980/12/17 800 NaN 20 40.380822
    1 7499 ALLEN SALESMAN 7698.0 1981/02/20 1600 300.0 30 40.202740
    2 7521 WARD SALESMAN 7698.0 1981/02/22 1250 500.0 30 40.197260
    3 7566 JONES MANAGER 7839.0 1981/04/02 2975 NaN 20 40.090411
    4 7654 MARTIN SALESMAN 7698.0 1981/09/28 1250 1400.0 30 39.600000

     


    [SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE]   SQL EMP 예제로 만나는 테이블 데이터 전처리 방법 리스트

    반응형

    댓글