Функция возврата определенного дня месяца
Это было полезно для нашего плана обслуживания, поскольку мы можем использовать один скрипт и добавить код, который будет работать в определенный день (например, в последнее воскресенье или 1-й рабочий день), я также использовал его для прогнозирования времени, в течение которого Джобс будет работать на Наших серверов.
Функция требует только три входа, месяц, в котором вы заинтересованы, тип и номер.
Он использует аналогичную информацию, используемую Microsoft для ежемесячных графиков работы.
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
Для @Type. 1 = воскресенье, 2 = понедельник, 3 = вторник, 4 = среда, 5 = четверг, 6 = пятница, 7 = суббота
Для @Counter 1 = 1, 2 = 2-й, 3 = 3-й, 4 = 4-й и т. Д., 32 = последний (они немного отличаются)
Последующие шаги заключаются в следующем:
- Установите дату ввода в первый день месяца
- Объявлять переменные для нашего цикла через месяц
- Перебирайте каждую дату и обновляйте счетчик совпадений, если есть совпадение, и обновляйте временную дату, чтобы провести последний матч
- Если совпадения совпадают с нашим счетчиком, а счетчик меньше 5 (5 = последний день), тогда установите дату возврата в качестве временной даты, это приведет к выходу из цикла, поскольку дата больше не равна нулю.
- Добавьте одно к нашей текущей дате и повторите нашу проверку.
- Верните нашу дату, или если нулевая дата temp, которая была нашим последним матчем.
Ниже приведен пример его использования, где он может быть добавлен, например, к нашим планам технического обслуживания . Это будет работать в последнее воскресенье каждого месяца.
SQL
--Run your code here...
END