Ayın Belirli Gününü Döndürme İşlevi
Bu, bir komut dosyası kullanabileceğimiz ve belirli bir günde (geçen Pazar veya 1. Hafta içi gibi) çalışacak kod ekleyebildiğimiz için, bakım planımız için faydalı oldu, ayrıca İşlerin çalışacağı saatleri tahmin etmek için de kullandım. sunucularımız.
İşlev, ilgilendiğiniz ay, tür ve sayı olmak üzere yalnızca üç giriş gerektirir.
Aylık iş programları için Microsoft'un kullandığına benzer bilgileri kullanır.
SQL
CREATE FUNCTION dbo.GetMonthDay(@Month DATETIME,@Type INT, @Counter INT) RETURNS DATETIME AS BEGINSET @Month = CONVERT(DATE,DATEADD(DAY,1-DATEPART(DAY,@Month),@Month))DECLARE @CurDate DATETIME=@Month,@Date DATETIME,@Matches INT=0,@TempDate DATETIMEWHILE @CurDate 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 (CASE WHEN DATEPART(WeekDay,@CurDate) IN (1,7) THEN 1 ELSE 0 END)ELSE 0 END))=1 BEGINSET @Matches = @Matches+1SET @TempDate = @CurDateENDIF @Matches=@Counter AND @Counter<32 BEGINSET @Date=@TempDateENDSET @CurDate=DATEADD(DAY,1,@CurDate)ENDRETURN ISNULL(@Date,@TempDate)ENDGO
Bu ne yapar
Elimizdeki değerler sysschedules tablosuna benziyor ama burada listeleyeceğim;
@Tip
- 1=Pazar
- 2=Pazartesi
- 3=Salı
- 4=Çarşamba
- 5=Perşembe
- 6=Cuma
- 7=Cumartesi
- 8=Sayaca kadar herhangi bir gün veya ayın son günü
- 9=hafta içi herhangi bir gün veya ayın son günü
- 10=sayaca kadar herhangi bir Cumartesi veya Pazar veya ayın son tekrarı
@Tezgah
- 1=1.
- 2=2.
- 3=3.
- 4=4.
- 32=Son (bunlar biraz farklıdır)
İzlediği adımlar şu şekildedir;
- Giriş tarihini ayın ilk gününe ayarlayın
- Ay boyunca döngümüz için değişkenler bildirin
- Her bir tarihi gözden geçirin ve bir eşleşme varsa eşleşme sayısını güncelleyin ve son eşleşmeyi tutmak için geçici bir tarihi güncelleyin
- Eşleşmeler bizim sayacımıza eşitse ve sayaç 5'ten küçükse (5=son gün) o zaman dönüş tarihimizi geçici tarih olarak ayarlayın, tarih artık boş olmadığı için bu döngüden çıkacaktır.
- Güncel tarihimize bir tane ekleyip kontrolümüzü tekrar gerçekleştirelim.
- Tarihimizi döndürün veya null ise son eşleşmemiz olan geçici tarihi.
Aşağıda kullanımda bir örneğidir. Bu, Şubat ayının her Pazar günü gerçekleştirilecek.
Saklı bir yordamın belirli bölümlerinin çalıştırılıp çalıştırılmayacağını belirlemek için bir IF yan tümcesinde kullanabilirsiniz.
Testing
SELECT Utilities.dbo.GetMonthDay('2020-02-11',1,1) --2020-02-02 00:00:00.000SELECT Utilities.dbo.GetMonthDay('2020-02-11',1,2) --2020-02-09 00:00:00.000SELECT Utilities.dbo.GetMonthDay('2020-02-11',1,3) --2020-02-16 00:00:00.000SELECT Utilities.dbo.GetMonthDay('2020-02-11',1,4) --2020-02-23 00:00:00.000SELECT Utilities.dbo.GetMonthDay('2020-02-11',1,32)--2020-02-23 00:00:00.000IF Utilities.dbo.GetMonthDay('2020-02-11',1,32)='2020-02-23' BEGINSELECT 'Run your code'END
daha fazla okuma
Umarım işinize yarar veya diğer işlemler için fikir verir.
Tatillerle hesaplamanız gerekiyorsa, bir takvim tablosuna ihtiyacınız olacak ve aşağıdaki bağlantıda harika bir örnek görebilirsiniz.