Für die Datumstabelle Antwort:
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;
etwas in diesen lin Es wird Ihnen eine Liste von Tagen für mehrere Jahre geben. Dann können Sie sich diesem Tisch anschließen, um den gewünschten Bereich zu erhalten.
Um die Tabelle zu verbessern, können Sie Informationen zur Bezeichnung von Feiertagen und Wochenenden hinzufügen, sodass nur die Tage angezeigt werden, an denen die Schule tatsächlich stattfindet. Und am wichtigsten ist, dass Sie alles nach dem aktuellen Schuljahr filtern können, das Sie sehen möchten. Sie müssen sich keine Sorgen machen, das Schuljahr zu erhöhen, wenn es Zeit für einen Wechsel ist.
Aber es stellt sich wieder die Frage, was ist Ihr ultimatives Ziel dieser Abfrage? Möglicherweise gibt es sogar noch bessere Möglichkeiten, um Ihr Ziel zu erreichen.
Woher wissen Sie, wann die Schule nächstes Jahr beginnt? Beginnt es immer am 1. Juli und endet am 30. Juni? – Alex
Ja beginnt immer am 07/01 und endet am 30.06. Also möchte ich mein Startjahr erhöhen und mein letztes Jahr nach dem Schuljahr endet. –
Der Rest der Abfrage ist relevant. Bitte posten Sie es. –