: 그 린 함께
CREATE TABLE calendar (
SeqNum int
, schooldt date NOT NULL PRIMARY KEY
, theYear int
, theMonth tinyint
, theDay tinyint
, schoolyear int
, isSchoolDay tinyint /* Can count schooldays */
, isHoliday tinyint /* Can count holidays. */
)
DECLARE @StartDate date = '1/1/2010'
/* Build tally table with 10^x rows */
; WITH TallyTable (x) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(x) -- 10 days
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(x) -- 100 days
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(x) -- 1000 days
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) d(x) -- 10000 days
)
INSERT INTO calendar (SeqNum, schooldt, theYear, theMonth, theDay, schoolyear, isSchoolDay, isHoliday)
SELECT
tt.x AS SeqNum
, d1.theDate
, d2.theYear
, d2.theMonth
, d2.theDay
, d2.theSchoolYear
, 1 , 0 /* Defaults for isSchoolDay and isHoliday. Add if needed. */
FROM TallyTable tt
CROSS APPLY (
SELECT theDate = DATEADD(dd, (tt.x-1), @StartDate) /* Starting date */
) d1
CROSS APPLY
(
SELECT theYear = DATEPART(yy,d1.theDate)
, theMonth = DATEPART(mm,d1.theDate)
, theDay = DATEPART(dd,d1.theDate)
, theSchoolYear = CASE WHEN DATEPART(mm,d1.theDate) < 7 THEN DATEPART(yyyy,d1.theDate) ELSE DATEPART(yyyy,d1.theDate)+1 END
) d2;
뭔가 es는 몇 년 동안의 일 목록을 제공합니다. 그런 다음이 테이블에 가입하여 원하는 범위를 얻을 수 있습니다.
표를 향상 시키려면 공휴일과 주말을 레이블링하는 정보를 포함시켜 학교가 실제로 세션에 참여하는 날만 볼 수 있습니다. 그리고 가장 중요한 것은,보고자하는 현재 학년도까지 모든 것을 걸러 낼 수 있다는 것입니다. 변경할 시간이되면 학년을 늘리는 것에 대해 걱정할 필요가 없습니다.
하지만이 질문에 대한 궁극적 인 목표는 무엇입니까? 궁극적 인 목표를 달성하는 더 좋은 방법이있을 수 있습니다.
내년에 학교가 시작될 때 어떻게 알 수 있습니까? 항상 7 월 1 일에 시작하여 6 월 30 일에 종료합니까? – Alex
예는 항상 07/01에 시작하고 06/30에 끝납니다. 그래서 나는 학년이 끝난 후 첫해와 내년을 늘리고 싶습니다. –
나머지 쿼리는 관련이 있습니다. 게시 해주세요. –