T-SQL: Generate a list of dates – Sıralı Tarih tablosu

By | January 6, 2014

Merhabalar,

Bazen tarih değerlerine bağlı kriterleri sorgulamak isteyebilirsiniz ama sorgulamak istediğiniz tablonun tarih değerleri sıralı bir şekilde gitmiyorsa aldığınız raporda da olmayan tarih bilgilerini görüntüleyemezsiniz.

Bahsedilen bilgiyi örneklendirecek olursak eğer ;

Bir işverensiniz ve çalışanlarınız her gün ürünleriniz hakkında not girişleri yapıyor. Çalışanlarınızın hangi tarihlerde not girişi yapmadıklarını görmek istediğinizde nasıl bir yöntem izlemeniz gerekmektedir. Bahsedilen örnek için yazı olarak anlatmayı bırakıp biraz daha kod üzerinden anlatmaya devam edeyim.

-- Çalışanlarınızı not girişlerinin yapıldığı tablomuz olan TabloA'nın çok basit olan yapısını görelim :)
CREATE TABLE TabloA ( ID INT IDENTITY(1,1) ,Tarih DATETIME , notlar VARCHAR(10))

-- Tablomuzu oluşturduğumuza göre bu tablo içerisine örnek kayıt girişlerini gerçekleştirelim.
INSERT INTO TabloA VALUES('2014-01-17 00:00:00','Test1')
INSERT INTO TabloA VALUES('2014-01-19 00:00:00','Test2')
INSERT INTO TabloA VALUES('2014-03-19 00:00:00','Test3')
INSERT INTO TabloA VALUES('2014-04-21 00:00:00','Test4')

-- Tablomuz içeriği ile beraber hazır olduğuna göre artık Sıralı tarih bilgisi ile dolu olan tarih tablomuzu oluşturalım.  ( Generate a list of dates )

IF EXISTS(SELECT * FROM ##GenerateDate)
 DROP TABLE ##GenerateDate
CREATE TABLE ##GenerateDate (DateValue DATETIME)
go
with mycte as
 (
select cast('2014-01-01' as datetime) DateValue
 union all
select DateValue + 1
from mycte
where DateValue + 1 < '2014-01-20'
)

INSERT INTO ##GenerateDate
select DateValue
from mycte
OPTION (MAXRECURSION 0)
go

--  Sıralı tarih bilgisi ile dolu olan tablomuzda hazır artık yapılması gereken istenilen rapor şeklinde not girişi yapılmamış zamanların raporlarını almaya..

select ##GenerateDate.DateValue FROM ##GenerateDate
LEFT JOIN TabloA ON ##GenerateDate.DateValue = TabloA.Tarih
WHERE dbo.TabloA.notlar IS NULL

Bu makaleyi de burada bitirerek bir sonraki makalede görüşmek üzere..

Leave a Reply

Your email address will not be published. Required fields are marked *