返回特定日期的功能
这对于我们的维护计划非常有用,因为我们可以使用一个脚本并添加在特定日期(如上周日或第一个工作日)运行的代码,我也用它来预测Jobs运行的时间我们的服务器。
该功能只需要三个输入,您感兴趣的月份,类型和数量。
它使用与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 = 1st,2 = 2nd,3 = 3rd,4 = 4th等...,32 = Last(这些略有不同)
其步骤如下:
- 将输入日期设置为月份的第一天
- 声明本月的循环变量
- 循环遍历每个日期,如果有匹配则更新匹配计数,并更新暂存日期以保存最后一个匹配项
- 如果匹配等于我们的计数器,并且计数器小于5(5 =最后一天),则将我们的返回日期设置为临时日期,然后将退出循环,因为日期不再为空。
- 将一个添加到我们当前的日期,然后再次执行检查。
- 返回我们的日期,或者如果是我们最后一次匹配的临时日期。
以下是使用中的一个示例,可以将其添加到我们的维护计划中 。这将在每个月的最后一个星期日运行。
SQL
--Run your code here...
END