일자별로 일정을 저장하는 테이블을 가정해봅시다. 일정이 있는 날의 데이터만 저장되어 있습니다.
이제 이 데이터를 달력이나 일주일씩 화면에 표시하는 방법을 생각해 보겠습니다.
두 가지 방법이 있을 수 있겠습니다.
첫 번째는 데이터베이스에서 원하는 월 또는 주 기간의 데이터를 조회합니다. 프로그램으로 기간 동안의 날짜 데이터 리스트를 만듭니다. 리스트를 루핑하면서 그 날짜에 데이터베이스에서 조회한 데이터가 있는지 다시 루핑하면 체크하여 데이터가 있으면 출력합니다.
두 번째는 데이터베이스에서 데이터를 만들때 원하는 기간의 날짜를 모두 만든 다음에 일정 테이블에 조인하여 결과를 만드는 것입니다. 일정이 있는날과 일정이 없는날 모두 데이터가 만들어지고 프로그램에서는 루핑하면서 출력하면 됩니다.
두 번째 방법을 사용하기 위해서 오라클에서 날짜 데이터를 생성하는 방법을 알아보겠습니다.
1. 다른 데이터가 있는 테이블과 ROWNUM을 사용하는 방법
- 원하는 날짜 범위만큼의 충분한 데이터가 있는 테이블을 사용합니다.
SELECT TO_CHAR(TO_DATE('2018-07-01', 'YYYY-MM-DD') + ROWNUM - 1, 'YYYY-MM-DD') AS "DATE"
, TO_CHAR(TO_DATE('2018-07-01', 'YYYY-MM-DD') + ROWNUM - 1, 'DAY') AS DAYOFWEEK
, TO_CHAR(TO_DATE('2018-07-01', 'YYYY-MM-DD') + ROWNUM - 1, 'DY') AS SDOW
, TO_CHAR(TO_DATE('2018-07-01', 'YYYY-MM-DD') + ROWNUM - 1, 'D') AS NDOW
FROM ALL_OBJECTS
WHERE ROWNUM <= 7;
2. CONNECT BY 구문을 사용하는 방법입니다.
SELECT TO_CHAR(TO_DATE('2018-07-01','YYYY-MM-DD') + LEVEL, 'YYYY-MM-DD') AS "DATE"
, TO_CHAR(TO_DATE('2018-07-01','YYYY-MM-DD') + LEVEL, 'DAY') AS DAYOFWEEK
, TO_CHAR(TO_DATE('2018-07-01','YYYY-MM-DD') + LEVEL, 'DY') AS SDOW
, TO_CHAR(TO_DATE('2018-07-01','YYYY-MM-DD') + LEVEL, 'D') AS NDOW
FROM DUAL
CONNECT BY LEVEL <= 7;
이제 위에서 만들어진 쿼리를 서브쿼리로하여 원하는 테이블과 조인해서 원하는 데이터를 만들면되겠습니다.
일자별 데이터를 데이터가 존재하는 날짜와 빈날짜를 모두 가지는 데이터로 조회 하기 위해서 원하는 기간의
날짜 데이터를 생성하는 방법을 알아보았습니다.
'프로그래밍 > 데이터베이스' 카테고리의 다른 글
ORA-01461 Long 열에 입력할때만 Long 값을 바인딩 할 수 있다. (0) | 2018.08.21 |
---|---|
MySQL(MariaDB) 서버 타임존 설정하기 (12) | 2018.07.17 |
오라클 에러 ORA-00984: 열을 사용할 수 없습니다 (0) | 2018.07.12 |
Oracle Open 백업 하기(Hot backup) (2) | 2018.04.21 |
Oracle Archive Mode 설정하기 (0) | 2018.04.21 |