IT/Database

Oracle SQL 이번주, 지난주 / 주간 집계 / 요일함수

K_sun 2021. 2. 21. 22:25

Oracle SQL 이번주, 지난주 / 주간 집계 / 요일함수

 

데이터베이스에서 집계, 통계를 조회할때 사용하는 요일/주간 함수 사용에 대한 포스팅입니다.

※ TRUNC 주(Week)에 대한 Format 
'w' : 매월1일 요일을 기준한 주초일자.
'ww' : 매년 1월1일 요일을 기준한 주초일자.
'iw' : 주초 월요일일자.
'd' / 'dy' / 'day' : 주초 일요일 일자.
 - 출처 : https://blog.naver.com/down83/50089087763

 

1. 월요일 기준

 - SYSDATE : 2021/02/21 기준

월요일 기준, 일주일

 

 - 이번주

-- 이번주 월요일
SELECT TRUNC(sysdate, 'iw') 이번주월요일 FROM DUAL;
-- 이번주 주간날짜
SELECT SYSDATE 오늘
    ,TRUNC(sysdate,'iw') 월
    ,TRUNC(sysdate,'iw')+1 화
    ,TRUNC(sysdate,'iw')+2 수
    ,TRUNC(sysdate,'iw')+3 목
    ,TRUNC(sysdate,'iw')+4 금
    ,TRUNC(sysdate,'iw')+5 토
    ,TRUNC(sysdate,'iw')+6 일
FROM DUAL;

 > RESULT

 

 - 지난주

-- 지난주 월요일
SELECT TRUNC(sysdate, 'iw')-7 지난주월요일 FROM DUAL;
-- 지난주 주간날짜
SELECT SYSDATE 오늘 ,
    TRUNC(sysdate,'iw')-7 월
    ,TRUNC(sysdate,'iw')-6 화
    ,TRUNC(sysdate,'iw')-5 수
    ,TRUNC(sysdate,'iw')-4 목
    ,TRUNC(sysdate,'iw')-3 금
    ,TRUNC(sysdate,'iw')-2 토
    ,TRUNC(sysdate,'iw')-1 일
FROM DUAL;

 > RESULT

 

 

 

2. 일요일 기준

 - SYSDATE : 2021/02/21 기준

일요일 기준, 일주일

 

 - 이번주

-- 이번주 일요일
SELECT TRUNC(sysdate, 'd') 이번주일요일 FROM DUAL;
-- 이번주 주간 날짜
SELECT SYSDATE 오늘
    ,TRUNC(sysdate,'d') 일
    ,TRUNC(sysdate,'d')+1 월
    ,TRUNC(sysdate,'d')+2 화
    ,TRUNC(sysdate,'d')+3 수
    ,TRUNC(sysdate,'d')+4 목
    ,TRUNC(sysdate,'d')+5 금
    ,TRUNC(sysdate,'d')+6 토
FROM DUAL;

 > RESULT

 

 - 지난주

-- 지난주 일요일
SELECT TRUNC(sysdate, 'd')-7 지난주일요일 FROM DUAL;
-- 지난주 주간날짜
SELECT SYSDATE 오늘
    ,TRUNC(sysdate,'d')-7 일
    ,TRUNC(sysdate,'d')-6 월
    ,TRUNC(sysdate,'d')-5 화
    ,TRUNC(sysdate,'d')-4 수
    ,TRUNC(sysdate,'d')-3 목
    ,TRUNC(sysdate,'d')-2 금
    ,TRUNC(sysdate,'d')-1 토
FROM DUAL;

 > RESULT

 

 

 

3. 사용 예, 지난주 요일별 가입자수 집계

 - 다음과 같은 회원테이블이 있을 때, 가입일(JOINDATE) 컬럼으로 지난주의 요일별 가입자 수 집계

회원테이블 구조

 

-- 지난주(월요일 기준) 요일별 가입자수 집계
SELECT
    (SELECT COUNT(*)
    FROM T_MEMBER
    WHERE TO_CHAR(JOINDATE, 'yyyymmdd') =
        TO_CHAR(TRUNC(sysdate,'iw')-7, 'yyyymmdd'))
    AS "월요일"
    ,(SELECT COUNT(*)
    FROM T_MEMBER
    WHERE TO_CHAR(JOINDATE, 'yyyymmdd') =
        TO_CHAR(TRUNC(sysdate,'iw')-6, 'yyyymmdd'))
    AS "화요일"
    ,(SELECT COUNT(*)
    FROM T_MEMBER
    WHERE TO_CHAR(JOINDATE, 'yyyymmdd') =
        TO_CHAR(TRUNC(sysdate,'iw')-5, 'yyyymmdd'))
    AS "수요일"
    ,(SELECT COUNT(*)
    FROM T_MEMBER
    WHERE TO_CHAR(JOINDATE, 'yyyymmdd') =
        TO_CHAR(TRUNC(sysdate,'iw')-4, 'yyyymmdd'))
    AS "목요일"
    ,(SELECT COUNT(*)
    FROM T_MEMBER
    WHERE TO_CHAR(JOINDATE, 'yyyymmdd') =
        TO_CHAR(TRUNC(sysdate,'iw')-3, 'yyyymmdd'))
    AS "금요일"
    ,(SELECT COUNT(*)
    FROM T_MEMBER
    WHERE TO_CHAR(JOINDATE, 'yyyymmdd') =
        TO_CHAR(TRUNC(sysdate,'iw')-2, 'yyyymmdd'))
    AS "토요일"
    ,(SELECT COUNT(*)
    FROM T_MEMBER
    WHERE TO_CHAR(JOINDATE, 'yyyymmdd') =
        TO_CHAR(TRUNC(sysdate,'iw')-1, 'yyyymmdd'))
    AS "일요일"
FROM DUAL;

 > RESULT

지난주 요일별 가입자수 집계결과