T-SQL Dinamik Tarih Tablosu Oluşturma

Ayın belirli günlerini içeren dinamik bir tarih tablosu oluşturmak için aşağıya ekleyeceğim kısa sorgu işimizi görecektir. Ben sorguda dinamik tarih tablosunu bir değişken olarak kullandım. Siz de isterseniz bir sorgunun içinde değişken olarak, veya bu dinamik tarih tablosu sorgusunu bir “table function” a çevirerek yada bir tabloya yazdırarak da kullanabilirsiniz. Şimdi sorgumuza geçelim…

--== Burada tarih aralığımızı seçiyoruz. İster elle isterseniz tarih fonksiyonlarını
--==  kullanarak yine dinamik olarak belirleyebilirsiniz.

DECLARE @firstdate date='20220101'
DECLARE @lastdate  date='20221231'

--== Tarih aralığımızı belirledikten sonra tarih tablosunda sadece cuma günleri ve
--==  ay sonlarının olmasını istediğim için aşağıdaki değişkenleri oluşturdum.

--== Gün adı 'Friday', Ayın sonu için ise şartı döngü içerisinde vereceğiz.

DECLARE @day_name nvarchar(10)='Friday' 
DECLARE @id int=1


--== Tarih tablo değişkenini oluşturuyoruz.

DECLARE @date_table TABLE (id_ int,date_ date,year_ int,month_ smallint,day_ smallint)

--== Döngümüzü başlatıyoruz...

 WHILE @firstdate<=@lastdate
 BEGIN
     IF
	
     DATENAME(WEEKDAY,@firstdate)=@day_name   --Hafta adı 'Friday' ise
     OR	
     @firstdate=EOMONTH(@firstdate)           -- Tarih ayın son tarihi ise

 --== Şart doğru ise tarihi tablomuza insert ediyoruz ve tarihe bir gün ekliyoruz.

         BEGIN
         INSERT INTO @date_table(id_,date_,year_,month_,day_)
         SELECT @id ,@firstdate ,YEAR(@firstdate) ,MONTH(@firstdate) ,DAY(@firstdate);
         SET @firstdate=DATEADD(DAY,1,@firstdate)
         SET @id=@id+1
         END
 --== Tarih şartları sağlamıyor ise sadece ilk tarihe bir gün ekliyoruz.
     ELSE 
		
	 BEGIN
	 SET @firstdate=DATEADD(DAY,1,@firstdate)
	 END
 END

Şimdi sorgumuzun çıktısına bakalım.

Sizde yukarıdaki sorguyu kendi ihtiyaçlarınıza göre geliştirerek istediğiniz dinamik tarih tablosunu kolayca elde edebilirsiniz. Umarım paylaşımı beğenmişsinizdir. Bir sonraki yazıda görüşmek üzere…

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir