Wie man data aus einer Tabelle ausschaltet, wenn man zwischen zwei data sucht?

Ich habe eine Abfrage erstellt, wo es zwischen zwei data suchen kann, um Arbeitstage ohne Bankfeiertage zu berechnen.

Ich habe einen Tisch mit data innerhalb der Feiertage erstellt

Wie kann ich eine Abfrage erstellen, bei der bei der search zwischen den beiden data die data in der Tabelle ausgeschlossen sind?

Hier ist was ich bisher habe …

DECLARE @StartDate DATETIME DECLARE @EndDate DATETIME -- Calculate the calendar working days below INCLUDING BH --YEAR/MONTH/DATE SET @StartDate = '2016/09/01' SET @EndDate = '2016/09/30' SELECT (DATEDIFF(dd, @StartDate, @EndDate) + 1) -(DATEDIFF(wk, @StartDate, @EndDate) * 2) -(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END) -(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN 1 ELSE 0 END) DECLARE @TotalDays INT, @WorkDays INT SET @TotalDays = (DATEDIFF(dd, @StartDate, @EndDate) +1) print @TotalDays 

Sie können zwischen zwei data berechnen, indem Sie dies manipulieren

 DECLARE @sql VARCHAR(500), @Region VARCHAR(100) = 'COLUMN2', --It can be Column1, Column2..... @StartDate DATETIME = '2016-04-10', @EndDate DATETIME = '2016-04-15' SET @sql = ' SELECT COUNT(' + @Region + ') FROM bankholidays WHERE ' + @Region + ' BETWEEN ''' + CAST(@StartDate AS VARCHAR) + ''' AND ''' + CAST(@EndDate AS VARCHAR) + '''' EXEC (@SQL) 

Es sieht so aus, als ob du diesen Trick bereits benutzt hast, um die Arbeitstage (dh ohne Wochenenden) zwischen zwei Terminen zu bekommen.

NB: Diese Lösung geht davon aus, dass die Sprache der session Englisch ist, und dass Samstag und Sonntag als nicht arbeitende Tage gelten; diese Annahmen sind vielleicht nicht für alle Kulturen wahr.

Von diesem Beitrag aus scheint es, dass du bereits auf dem richtigen path bist, um Bankfeiertage auszuschließen. dh

 DECLARE @StartDate DATETIME = '2016-09-01' DECLARE @EndDate DATETIME = '2016-09-30' DECLARE @TotalDays INT, @WorkDays INT SELECT @TotalDays = (DATEDIFF(dd, @StartDate, @EndDate) +1) , @WorkDays = (DATEDIFF(dd, @StartDate, @EndDate) + 1) --get the number of working days between 2 dates (including the date itself) -(DATEDIFF(wk, @StartDate, @EndDate) * 2) --get the number of weekend days (ie 2 x number of weeks) -(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END) --\_then take into account if the current date fell over a weekend -(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN 1 ELSE 0 END) --/ - coalesce( ( select count(1) from BankHolidays where HolidayDate between @StartDate and @EndDate ) ,0) --and remove any bank holidays which fall during this period print @TotalDays print @WorkDays 

Beachten Sie auch, dass dies davon ausgeht, dass alle Bankfeiertage in Ihrer Tabelle gegen Wochentage sind; nicht am Wochenende (dh ansonsten würden diese Tage zweimal eingeschlossen).

  • In Großbritannien, wenn ein Bankfeiertag auf ein Wochenende fällt (zB Weihnachten in diesem Jahr ist an einem Sonntag), wird dieser Bankfeiertag zum nächsten Werktag versetzt (auch unter anderen Bankfeiertagen, dh Boxen Tag am 26. Dezember ist eine Bank Urlaub in Großbritannien, so dass die Weihnachtsbank Urlaub fällt auf 27. (oder fällt auf 26. und Boxing Day's Offset bis 27., je nachdem, wie Sie es vorziehen, es sich vorzustellen).
  • Doch andere Kulturen können sich anders verhalten. Auch manche Leute werden erwartet, um Wochenenden zu arbeiten, also sollte der Feiertag normalerweise auf das Wochenende fallen, das sie noch erhalten können, dass als Feiertag und nicht den versetzten Bankfeiertag haben; nur um mehr Verwirrung hinzuzufügen).