캘린더와 첫 번째 주를 Oracle Database에서 검색하는 방법

3569 단어 오라클SQL달력

하고 싶은 일



대상의 날짜가 그 달의 제 2주째에 있는지를 내고 싶다. (주의 시작은 일요일로 한다)
2019년 12월에 비유하면, 이미지는 이하.


필요한 배경



주마다 값을 집계하는 SQL을 쓰게 되어, 조사해도 to_char의 'w'로 그 일자가 제 ○요일인지의 요구 방법 밖에 나오지 않았으므로, 비망록으로서 투고.

결론



로직이나 SQL만 알고 싶은 사람을 위해 먼저 결론을 써 둡니다.

수식


(対象日付 + 月初日付の曜日番号 - 1 + 6 ) ÷ 7

SQL 샘플


SELECT
  TRUNC((TO_NUMBER(TO_CHAR(TO_DATE('2020/01/01', 'YYYY/MM/DD'),'DD')) + TO_NUMBER(TO_CHAR(TRUNC(TO_DATE('2020/01/01', 'YYYY/MM/DD'),'MONTH'),'D')) - 1 + 6) / 7,0) as week
 FROM
   DUAL

구체적인 방법



우선, 월초의 요일을 신경쓰지 않고, 그 일자가 제 몇주에 있는지를 7로 나눈 몫으로 요구합니다.
첫 번째 주목은 1로 내기 때문에 날짜에 6을 더합니다.
(7일에 7을 더해 14로 하면 2가 되어 버리므로, 6을 더합니다)

예)
x월 1일 + 6/7 = 1 (별로 0)
x월 2일 + 6/7 = 1 (별로 1)
x월 3일 + 6/7 = 1 (별로 2)
x월 4일 + 6/7 = 1 (별로 3)
x월 5일 + 6/7 = 1 (별로 4)
x월 6일 + 6/7 = 1 (별로 5)
x월 7일 + 6/7 = 1 (별로 6)

지금까지 다음 식이 완성됩니다.(対象日付 + 6) ÷ 7
그런 다음 해당 달의 시작 요일을 찾습니다.
캘린더는 반드시 일요일에 시작하는 것은 아니므로 고려해야합니다. . .

그래서 시작일의 요일 번호를 얻습니다.
※Oracle에서는, 요일 번호는 to_char의 'D'로 취득할 수 있습니다.

각 요일 번호는 다음과 같습니다.


번호
요일


1
일요일

2
월요일

3
화요일

4
수요일

5
목요일

6
금요일

7
토요일


2020년 1월을 예로 들면 다음과 같이 합니다.


일요일부터 시작요일까지의 차이를 구합니다.
2020년 1월은 시작요일이 수요일이며, 일요일부터 3일이 지나고 있기 때문에 방정식의 대상 날짜 뒤에 曜日番号 - 1를 더합니다.(対象日付 + 曜日番号 - 1 + 6) ÷ 7
이것으로 식이 완성되었습니다.
시험에 2020/01/01을 대상 날짜로 하면 다음과 같이 됩니다.(1 + 4 - 1 + 6) ÷ 7 = 1週目

SQL에서 캘린더를 표시하고 해당 날짜에 해당하는 주 번호 표시



지금까지의 생각을 사용해, 2020/01/01~2020/01/31의 일자와 주 번호를 구하는 샘플은 이하와 같습니다.

SQL 샘플


SELECT
  TRUNC(TO_DATE('2020/01/01', 'YYYY/MM/DD'),'MONTH') + ROWNUM - 1 as ac_date,
  TRUNC((TO_NUMBER(TO_CHAR(TRUNC(TO_DATE('2020/01/01', 'YYYY/MM/DD'),'MONTH') + ROWNUM - 1,'DD')) + TO_NUMBER(TO_CHAR(TRUNC(TO_DATE('2020/01/01', 'YYYY/MM/DD'),'MONTH'),'D')) - 1 + 6) / 7,0) as week
 FROM
   ALL_CATALOG
 WHERE
   TRUNC(TO_DATE('2020/01/01', 'YYYY/MM/DD'),'MONTH') + ROWNUM - 1 <= LAST_DAY(TO_DATE('2020/01/01', 'YYYY/MM/DD'))

실행 결과


AC_DATE        WEEK
-------- ----------
20-01-01          1
20-01-02          1
20-01-03          1
20-01-04          1
20-01-05          2
20-01-06          2
20-01-07          2
20-01-08          2
20-01-09          2
20-01-10          2
20-01-11          2
20-01-12          3
20-01-13          3
20-01-14          3
20-01-15          3
20-01-16          3
20-01-17          3
20-01-18          3
20-01-19          4
20-01-20          4
20-01-21          4
20-01-22          4
20-01-23          4
20-01-24          4
20-01-25          4
20-01-26          5
20-01-27          5
20-01-28          5
20-01-29          5
20-01-30          5
20-01-31          5

31行が選択されました。

좋은 웹페이지 즐겨찾기