Fonction de retour du jour spécifique du mois
Cela a été utile pour notre plan de maintenance, car nous pouvons utiliser un script et ajouter un code qui fonctionnera un jour précis (comme le dernier dimanche ou le 1er jour de la semaine), je l'ai également utilisé pour prévoir les heures d'exécution de Jobs Nos serveurs.
La fonction ne nécessite que trois entrées, le Mois qui vous intéresse, le type et le numéro.
Il utilise des informations similaires à celles de Microsoft pour les horaires de travail mensuels.
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
Pour @Type. 1 = dimanche 2 = lundi 3 = mardi 4 = mercredi 5 = jeudi 6 = vendredi 7 = samedi
Pour @Counter, 1 = 1er, 2 = 2ème, 3 = 3ème, 4 = 4ème etc ..., 32 = Dernier (ceux-ci sont légèrement différents)
Les étapes suivantes sont les suivantes;
- Réglez la date d'entrée au premier jour du mois
- Déclarez les variables pour notre boucle au cours du mois
- Faites une boucle dans chaque date et mettez à jour le nombre de matchs s'il y a une correspondance et mettez à jour une date temporaire pour tenir la dernière correspondance
- Si les correspondances sont égales à notre compteur et que le compteur est inférieur à 5 (5 = dernier jour), définissez notre date de retour en tant que date temporaire, cela va alors quitter la boucle car la date n'est plus nulle.
- Ajoutez un à notre date actuelle et effectuez notre vérification à nouveau.
- Retournez notre date, ou si null la date de la temp qui était notre dernière correspondance.
Voici un exemple de l'utilisation, où il pourrait être ajouté à l'exemple de nos plans de maintenance . Cela se déroulera le dernier dimanche de chaque mois.
SQL
--Run your code here...
END