Questo script T-SQL nasce dall'esigenza di trovare la prossima data in cui eseguire un azione basandosi su una maschera di bit che rappresentano i giorni della settimana.
Per l'esattezza la codifica dei bit nella variabile @set è la seguente:
  • bit 0 Lunedì
  • bit 1 Martedì
  • bit 2 Mercoledì
  • bit 3 Giovedì
  • bit 4 Venerdiì
  • bit 5 Sabato
  • bit 6 Domenica
se la data odierna coincide con la prima data utile, viene eseguita l'azione.

SQL

-- maschera di bit con i giorni della settimana
-- bit 0= lunedì, bit 6= domenica
DECLARE @set int 

SET @set = 67	-- lun, mar e dom

-- trovi oggi
DECLARE @dt datetime
SET @dt = GETDATE()

-- prendo solo la parte relativa alla data (escludo l'ora)
SET @dt = DATEADD(DAY, 0, DATEDIFF(DAY, 0, @dt))

-- trovo l'inizio della settimana
SET DATEFIRST 1
DECLARE @offset int
SET @offset = datepart(weekday, @dt)-1
DECLARE @dtStart datetime
SET @dtStart = DATEADD(d, -@offset, @dt)

-- carico le date dei giorni selezionati (questa settimana e la successiva)
DECLARE @tbl TABLE (
	[date] datetime not null
)
DECLARE @i int
SET @i = 0
WHILE (@i < 7)
BEGIN
	IF (@set & power(2,@i)) != 0
	BEGIN
		INSERT INTO @tbl
		SELECT DATEADD(d, @i, @dtStart)
		INSERT INTO @tbl
		SELECT DATEADD(d, @i + 7, @dtStart)
	END
	SET @i = @i+1
END

-- estraggo le date successive ad oggi (solo per debug)
SELECT [date] 
 , CASE (DATEPART(weekday, [date]) + @@DATEFIRST) % 7
    WHEN 1 THEN 'Sunday'
    WHEN 2 THEN 'Monday'
    WHEN 3 THEN 'Tuesday'
    WHEN 4 THEN 'Wednesday'
    WHEN 5 THEN 'Thursday'
    WHEN 6 THEN 'Friday'
    WHEN 0 THEN 'Saturday'
  END AS [day]
FROM @tbl
WHERE [date] >= @dt
ORDER BY [date]

-- prendo la prima data
DECLARE @dtNext datetime 
SELECT TOP 1 @dtNext = [date] 
FROM @tbl
WHERE [date] >= @dt
ORDER BY [date]

-- esegui o meno l'azione
IF @dtNext	= @dt
	SELECT 'esegui azione' 
ELSE
	SELECT 'nessuna azione' 
Tags:
Database75 SQL90 SQL Server100 T-SQL66
Potrebbe interessarti anche: