Función para devolver el día específico del mes
Esto ha sido útil para nuestro plan de mantenimiento, ya que podemos usar un script y agregar código que se ejecutará en un día específico (como el último domingo, o el primer día de la semana), también lo he utilizado para pronosticar los tiempos en los que Jobs se ejecutará Nuestros servidores.
La función sólo requiere tres entradas, el mes que le interesa, el tipo y el número.
Utiliza información similar a la utilizada por Microsoft para los horarios de trabajo mensuales.
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 = Lunes, 3 = Martes, 4 = Miércoles, 5 = Jueves, 6 = Viernes, 7 = Sábado
Para @Counter, 1 = 1ª, 2 = 2ª, 3 = 3ª, 4ª = 4ª, etc ..., 32 = Última (son ligeramente diferentes)
Los pasos a seguir son los siguientes:
- Establezca la fecha de entrada al primer día del mes
- Declara variables para nuestro bucle a través del mes
- Hacer un bucle a través de cada fecha y actualizar el número de coincidencias si hay una coincidencia y actualizar una fecha temporal para celebrar el último partido
- Si las coincidencias igualan nuestro contador, y el contador es menor que 5 (5 = último día), entonces establezca nuestra fecha de retorno como la fecha temporal, esto saldrá entonces del bucle como la fecha ya no es nulo.
- Agregue uno a nuestra fecha actual y realice nuevamente nuestro cheque.
- Devuelve nuestra fecha, o si nula la fecha temporal que fue nuestro último partido.
A continuación se muestra un ejemplo de ello en uso, donde podría agregarse al ejemplo de nuestros planes de mantenimiento . Esto se ejecutará el último domingo de cada mes.
SQL
--Run your code here...
END