Schedulatore settimanale in T-SQL
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:
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
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'