본문 바로가기

IT/Database

[MSSQL] MS-SQL 달력만들기 SQL 문

특별하고 엄청난건 아니지만 나중에 스케줄 관련한 기능을 개발 할 때 참조하면 괜찮을 듯 합니다.

1. SQL 문

WITH t AS
(

--시작일자
SELECT DATEADD(d, 0, '201509'+'01') dt 
 UNION ALL

--종료일자
SELECT DATEADD(d, 1, dt) dt
  FROM t
 WHERE dt + 1 < DATEADD(m, 1, '201509'+'01')
)
SELECT [1] 일
     , [2] 월
     , [3] 화
     , [4] 수
     , [5] 목
     , [6] 금
     , [7] 토
  FROM (SELECT DATEPART(d, dt) d
             , DATEPART(w, dt) w
             , DATEPART(ww, dt) ww
          FROM t
        ) a
 PIVOT( MIN(d) FOR w IN
        ([1], [2], [3], [4], [5], [6], [7]) ) a;

2. 결과 데이터​
 

 

 

3. 유의 사항

  1)  데이터 베이스의 호환성 수준을 높인 상태에서 해야 합니다. 낮을 경우 'PIVOT' 근처의 구문이 잘못되었습니다. 이 기능을 사용하려면 현재 데이터베이스의 호환성 수준 값을 더 높게 설정해야 합니다. ALTER DATABASE의 SET COMPATIBILITY_LEVEL 옵션에 대해서는 도움말을 참조하십시오. 메시지가 나옵니다.

    - DB의 속성 확인은 호환성 수준을 확인하면 됩니다. 설정방법은 위 ALTER..구문의 도움말을 참조하세요.

       

  2)  시작일자와 종료일자의 날수 차이가 100일보다 크면 오류가 발생합니다. 이것도 처리가 가능할 것 같은데 그건 담에 찾아봐야 할 듯 합니다.

    - 오류 메시지 : 문이 종료되었습니다. 문이 완료되기 전에 최대 재귀 횟수(100)가 초과되었습니다.

 

4. Oracle의 경우 SQL문

  - 원문 주소에 보시면 Oracle의 경우에도 구문이 있습니다.

  - SQL 문

WITH t AS
(
SELECT dt + LEVEL - 1 dt
  FROM (SELECT TO_DATE('201503', 'yyyymm') dt
          FROM dual)
CONNECT BY LEVEL < = TO_CHAR(LAST_DAY(dt), 'dd')
)
SELECT 일, 월, 화, 수, 목, 금, 토
  FROM (SELECT TO_CHAR(dt, 'dd') d
             , TO_CHAR(dt, 'd' ) w
             , TRUNC(dt, 'd') ww
          FROM t
        )
PIVOT (MIN(d) FOR w IN
(1 일, 2 월, 3 화, 4 수, 5 목, 6 금, 7 토))
ORDER BY ww; 

 

5. 원문의 주소 : http://www.dbguide.net/knowledge.db?cmd=view&boardUid=185757&boardConfigUid=20&boardStep=1&categoryUid=206