Função para retornar o Dia específico do mês
Isso foi útil para o nosso plano de manutenção, pois podemos usar um script e adicionar um código que será executado em um dia específico (como o último domingo ou 1º dia da semana), eu também usei para prever as horas em que o Jobs será executado Nossos servidores.
A função requer apenas três entradas, o Mês em que você está interessado, o tipo e o número.
Ele usa informações semelhantes à Microsoft para horários de trabalho mensais.
SQL
ALTER FUNCTION FirstDay(@Month DATETIME,@Type INT, @Counter INT) RETURNS DATETIME
AS BEGIN
SET @Month = CONVERT(DATE,DATEADD(DAY,1-DATEPART(DAY,@Month),@Month))
DECLARE @CurDate DATETIME=@Month,@Date DATETIME,@Matches INT=0,@TempDate DATETIME
WHILE @CurDate<DATEADD(MONTH,1,@Month) AND @Date IS NULL BEGIN
IF (SELECT (CASE @Type WHEN 1 THEN (CASE WHEN DATEPART(WeekDay,@CurDate)=1 THEN 1 ELSE 0 END)
WHEN 2 THEN(CASE WHEN DATEPART(WeekDay,@CurDate)=2 THEN 1 ELSE 0 END)
WHEN 3 THEN(CASE WHEN DATEPART(WeekDay,@CurDate)=3 THEN 1 ELSE 0 END)
WHEN 4 THEN(CASE WHEN DATEPART(WeekDay,@CurDate)=4 THEN 1 ELSE 0 END)
WHEN 5 THEN(CASE WHEN DATEPART(WeekDay,@CurDate)=5 THEN 1 ELSE 0 END)
WHEN 6 THEN(CASE WHEN DATEPART(WeekDay,@CurDate)=6 THEN 1 ELSE 0 END)
WHEN 7 THEN(CASE WHEN DATEPART(WeekDay,@CurDate)=7 THEN 1 ELSE 0 END)
WHEN 8 THEN(CASE WHEN DATEPART(WeekDay,@CurDate) IN (1,2,3,4,5,6,7) THEN 1 ELSE 0 END)
WHEN 9 THEN(CASE WHEN DATEPART(WeekDay,@CurDate) IN (2,3,4,5,6) THEN 1 ELSE 0 END)
WHEN 10 THEN (CASEWHEN DATEPART(WeekDay,@CurDate) IN (1,7) THEN 1 ELSE 0 END)
ELSE 0 END))=1 BEGIN
SET @Matches = @Matches+1
SET @TempDate = @CurDate
END
IF @Matches=@Counter AND @Counter<32 BEGIN
SET @Date=@TempDate
END
SET @CurDate=DATEADD(DAY,1,@CurDate)
END
RETURN ISNULL(@Date,@TempDate)
END
GO
Para @Type. 1 = domingo, 2 = segunda-feira, 3 = terça-feira, 4 = quarta-feira, 5 = quinta-feira, 6 = sexta-feira, 7 = sábado
Para @Counter, 1 = 1º, 2 = 2º, 3 = 3º, 4 = 4º etc ..., 32 = Último (estes são ligeiramente diferentes)
Os passos a seguir são os seguintes;
- Defina a data de entrada para o primeiro dia do mês
- Declare variáveis para o nosso ciclo ao longo do mês
- Faça um loop por cada data e atualize a contagem de correspondência se houver uma correspondência e atualize uma data temporária para manter a última partida
- Se as correspondências equivalem ao nosso contador, e o contador é inferior a 5 (5 = último dia), defina a data de retorno como a data da temporização, então irá sair do loop, já que a data não é mais nula.
- Adicione um a nossa data atual e execute nossa seleção novamente.
- Retorna nossa data, ou se nula a data da temp que foi a nossa última partida.
Abaixo está um exemplo disso em uso, onde pode ser adicionado para exemplo nossos planos de manutenção . Isso será executado no último domingo de cada mês.
SQL
--Run your code here...
END