Fügen Sie einen datasatz für jeden Wochentag des Jahres zu einem leeren Tisch hinzu

Ich habe eine leere Tabelle, die zwei Spalten [ID] und [MyDate] . Ich möchte diesen Tisch mit all den Tagen des laufenden Jahres MINUS Wochenenden MINUS .

Gibt es eine Möglichkeit, dies mit einer SQL-Abfrage zu tun?

In diesem Fall verwende ich MSSQL T-SQL

Ich habe keine Beispiel-Code, da bin ich in einem Verlust auf, wo man für dieses Szenario zu starten.

Mit einer Nummern (Tally) -Tabelle können Sie vermeiden, Loops zu verwenden. Wenn du noch keine Zifferntabelle hast, kannst du dieses Skript verwenden, um es zu erstellen:

 SELECT TOP 10000 IDENTITY(int,0,1) AS Number INTO Tally FROM sys.objects s1 CROSS JOIN sys.objects s2 ALTER TABLE Tally ADD CONSTRAINT PK_NumbersTest PRIMARY KEY CLUSTERED (Number) 

Für weitere Informationen über die Erstellung einer Zifferntabelle, lesen Sie diese SO Post.

Jetzt, da du eine Zifferntabelle hast, kannst du ein cte benutzen, um die gewünschten Termine zu erzeugen. Ich habe DATEFROMPARTS und GETDATE() , um Jauary 1. des laufenden Jahres zu bekommen, wenn du eine Version von SQL server unter 2012 benutzt hast, musst du andere methods dafür verwenden:

 DECLARE @StartDate Date, @EndDate Date SELECT @StartDate = DATEFROMPARTS(YEAR(GetDate()), 1, 1) SELECT @EndDate = DATEADD(Year, 1, @StartDate) 

Jetzt erstellen Sie einen CTE, um die data zu erhalten, die mit der Zifferntabelle benötigt werden, und legen Sie die datasätze aus dem cte in die Tabelle ein:

 ;WITH CTE AS ( SELECT DATEADD(Day, Number, @StartDate) As TheDate FROM Tally WHERE DATEADD(Day, Number, @StartDate) < @EndDate ) INSERT INTO WeekDays SELECT TheDate FROM CTE WHERE DATEPART(WeekDay, TheDate) BETWEEN 2 AND 6 

Sehen Sie eine Live-Demo auf Reesterester.

Das wird es tun. Hier stehen die 1 und die 7 für Sonntag und Samstag

 CREATE TABLE T ( ID INT NOT NULL IDENTITY(1,1), MyDate DATE NOT NULL) DECLARE @Start DATE DECLARE @End DATE SET @Start = '20170101' SET @End = '20171231' WHILE @Start <= @End BEGIN IF (DATEPART(DW, @Start) NOT IN (1,7)) BEGIN INSERT INTO T (MyDate) VALUES (@Start) END SET @Start = DATEADD(DAY, 1, @Start) END SELECT * FROM T 

Hier ist mein schneller Versuch bei deinem Problem. Benutze einfach deinen Tisch

 select CAST('2017-03-15' as datetime) as datestuff into #test Delete from #test DECLARE @Y datetime = CAST('2017-12-31' AS DATE) while @y != '2017-01-01' begin if DATENAME(DW, @y) not IN ('SUNDAY', 'SATURDAY') BEGIN INSERT INTO #test SELECT @y END SET @Y = DATEADD(DD, -1, @Y) end select * from #test