Puoi utilizzare le seguenti funzioni. Il primo sposta un dato inizio o fine del lunedì (venerdì se indietro) se inizia nel fine settimana. Il secondo calcola i secondi tra due date senza fine settimana. Quindi devi solo verificare se il totale dei giorni è uguale ai giorni senza weksends (demo sotto).
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
quindi è possibile ottenere le informazioni in questo modo:
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
Ecco un 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
Ciò che definisce un "week-end?" Le vacanze ("weekend di tre giorni") contano? – zimdanen
In questo caso, un fine settimana significa semplicemente sabato e/o domenica. Proverò le vacanze pubbliche in un secondo momento, ma non è importante per questa domanda. :) – oshirowanen
Prima se il diff è 6 o più uno di quei giorni è un fine settimana. Se il diff è zero, è necessario controllare il giorno della settimana per sabato o domenica. Quindi assumere la domenica è il giorno della settimana 0. Se il giorno della settimana per la data di inizio è maggiore del giorno della settimana per la data di fine, ha almeno un giorno di fine settimana nell'intervallo. –