Sie können zurückkehren Verwenden Sie folgende Funktionen. Der erste verschiebt ein bestimmtes Start- oder Enddatum auf Montag (Freitag wenn rückwärts), wenn es am Wochenende beginnt. Die Sekunde berechnet die Sekunden zwischen zwei Daten ohne Wochenenden. Dann müssen Sie nur überprüfen, ob die Gesamttage den Tagen ohne Weksends entsprechen (Demo unten).
CREATE FUNCTION [dbo].[__CorrectDate](
@date DATETIME,
@forward INT
)
RETURNS DATETIME AS BEGIN
IF (DATEPART(dw, @date) > 5) BEGIN
IF (@forward = 1) BEGIN
SET @date = @date + (8 - DATEPART(dw, @date))
SET @date = DateAdd(Hour, (8 - DatePart(Hour, @date)), @date)
END ELSE BEGIN
SET @date = @date - (DATEPART(dw, @date)- 5)
SET @date = DateAdd(Hour, (18 - DatePart(Hour, @date)), @date)
END
SET @date = DateAdd(Minute, -DatePart(Minute, @date), @date)
SET @date = DateAdd(Second, -DatePart(Second, @date), @date)
END
RETURN @date
END
GO
CREATE FUNCTION [dbo].[__DateDiff_NoWeekends](
@date1 DATETIME,
@date2 DATETIME
)
RETURNS INT AS BEGIN
DECLARE @retValue INT
SET @date1 = dbo.__CorrectDate(@date1, 1)
SET @date2 = dbo.__CorrectDate(@date2, 0)
IF (@date1 >= @date2)
SET @retValue = 0
ELSE BEGIN
DECLARE @days INT, @weekday INT
SET @days = DATEDIFF(d, @date1, @date2)
SET @weekday = DATEPART(dw, @date1) - 1
SET @retValue = DATEDIFF(s, @date1, @date2) - 2 * 24 * 3600 * ((@days + @weekday)/7)
END
RETURN @retValue
END
Dann können Sie die Informationen auf diese Weise erhalten:
declare @start datetime
set @start = '20130614'
declare @end datetime
set @end = '20130615'
declare @daysTotal int
declare @daysWoWeekends int
SET @daysTotal = DATEDIFF(dd, @start, @end)
SET @daysWoWeekends = dbo.__DateDiff_NoWeekends(@start, @end)/(24 * 3600)
SELECT CASE WHEN @daysTotal = @daysWoWeekends
THEN 'No weekend between'
ELSE 'There are weeksends' END,
@daysTotal,
@daysWoWeekends,@start,@end
Hier ist eine Demo: http://sqlfiddle.com/#!6/7cda7/11
There are weeksends 1 0 June, 14 2013 00:00:00+0000 June, 15 2013 00:00:00+0000
was denn nun ein „Wochenende?“ Gilt Urlaub ("dreitägige Wochenenden")? – zimdanen
In diesem Fall bedeutet ein Wochenende einfach Samstag und/oder Sonntag. Ich werde die Feiertage später ausprobieren, aber nicht wichtig für diese Frage. :) – oshirowanen
Zuerst, wenn der Unterschied 6 oder mehr ist, ist einer dieser Tage ein Wochenende. Wenn das Diff Null ist, müssen Sie den Wochentag für Samstag oder Sonntag überprüfen. Dann nehmen wir an, dass Sonntag der Wochentag 0 ist. Wenn der Wochentag für das Startdatum größer als der Wochentag für das Enddatum ist, hat er mindestens einen Wochenendtag im Bereich. –