Geniş veri setleriyle çalışan Power BI gibi araçlarda, raporların hızlı yüklenmesi ve daha az kaynak tüketmesi için her aşamada performansı göz önünde bulunduran bir yaklaşım şart. Tarihe göre gruplamak da en önde gelen özetleme yaklaşımlarının başlarında yer alıyor. Bu yazıda SQL Server’da analiz için sık kullanılan tarih fonksiyonlarına değiniyoruz.
Detaylı seviyede tutulan veriler (dakika bazında) yerine, raporlama ihtiyacına göre daha geniş zaman dilimlerine (saatlik, günlük) odaklanmak, performansı önemli ölçüde artırır. Daha küçük bir veri kümesi, sorguların daha hızlı çalışmasını, daha az bellek kullanılmasını ve dolayısıyla raporlama sürelerinin kısalmasını sağlar.
Örneğin bir satış raporunuz var. Raporun bir bölümünde, yalnızca yıllar ve aylara göre üretilens ürünlerin sayısına ihtiyacınız var. İlgili tabloyu örnekteki gibi gruplayarak veri miktarını önemli ölçüde düşürebiliriz:
SELECT DATEPART(year, SellStartDate) AS yil,
DATEPART(month, SellStartDate) AS ay,
COUNT(*) AS 'toplam_ürün sayısı'
FROM Production.Product
GROUP BY DATEPART(year, SellStartDate), DATEPART(month, SellStartDate)
YEAR(), MONTH(), DAY(), EOMONTH() Fonksiyonları
YEAR(): Tarih içinden yıl bilgisini döndürür.
MONTH(): Tarih içinden ay bilgisini verir.
DAY(): Tarih içindeki gün bilgisini sağlar.
EOMONTH(): Bir tarihin ait olduğu ayın son gününü döndürür. Ayrıca, opsiyonel bir ikinci argüman ile önceki ya da sonraki ayların son gününü hesaplama imkanı sunar.
SELECT
SellStartDate,
YEAR(SellStartDate) AS Yıl,
MONTH(SellStartDate) AS Ay,
DAY(SellStartDate) AS Gün,
EOMONTH(SellStartDate,0) AS 'Ayın Son Günü',
EOMONTH(SellStartDate,-1) AS 'Bir Önceki Ayın Son Günü'
FROM Production.Product
GETDATE(), GETUTCDATE(), CAST(), TRY_CONVERT(), FORMAT, ISDATE() Fonksiyonları
GETDATE(): Mevcut yerel tarih ve saati döndürür.
GETUTCDATE(): UTC formatında tarih ve saati döndürür.
CAST(): Bir veri türünü başka bir veri türüne dönüştürür.
TRY_CONVERT(): Bir veri türünü başka bir veri türüne dönüştürür, başarısız olursa NULL döner.
FORMAT(): Sayı ve tarih/zaman verilerini belirli bir formatta stringe dönüştürür.
ISDATE(): Bir ifadenin geçerli bir tarih olup olmadığını kontrol eder ve bu, geçerli bir tarihse 1, değilse 0 döner.
USE AdventureWorks2022
GO
SELECT
SellStartDate,
GETDATE() AS 'GETDATE',
GETUTCDATE() 'UTCDATE',
TRY_CONVERT(DATE, SellStartDate) AS 'TRY_CONVERT',
CAST(GETDATE() AS DATE) AS CAST,
FORMAT(SellStartDate, 'dd-MM-yyyy') AS FORMAT,
ISDATE(SellStartDate) AS 'ISDATE'
FROM Production.Product
DATEFROMPARTS(), DATEADD(), DATEDIFF() Fonksiyonları
DATEADD(): Belirtilen bir tarih alanına (yıl, ay, gün vb.) istenilen süre kadar ekleme yapar ve yeni bir tarih döndürür.
DATEFROMPARTS(): Yıl, ay ve gün bilgileriyle belirli bir tarihi oluşturup, DATE veri tipine dönüştürür.
DATEDIFF(): İki tarih arasındaki farkı belirli bir birim (gün, ay, yıl vb.) cinsinden tamsayı olarak döndürür.
SELECT
SellStartDate,
--DATEADD
DATEADD(MONTH, -4, SellStartDate) AS 'SellStartDate -4 AY',
DATEADD(DAY, 95, SellStartDate) 'SellStartDate +95 GÜN',
--DATEFROMPARTS()
DATEFROMPARTS(2025,1,1) AS 'Tarih',
DATETIMEFROMPARTS(2024,9,20,11,44,34,0) AS 'TarihtenMilisaniyeye',
SMALLDATETIMEFROMPARTS(2025,1,1,12,30) AS 'TarihtenDakikaya',
TIMEFROMPARTS(5,4,3,2,2) AS 'Zaman',
--DATEDIFF()
DATEDIFF(DAY, SellStartDate, GETDATE()) AS 'Şimdi - SatışTarihi Gün Sayısı Farkı'
FROM Production.Product
DATEPART() ve DATENAME() Fonksiyonları
DATEPART(): Belirtilen bir tarihin istenilen parçasını (yıl, ay, gün, saat, vb.) tamsayı olarak döndürür.
DATENAME(): Belirtilen tarihin istenilen parçasını (yıl, ay, gün, vb.) metin (string) formatında döndürür.
Bu iki fonksiyon, tarih ve saat değerlerinin belirli kısımlarını elde etmek için yaygın olarak kullanılır ve SQL sorgularında tarih manipülasyonlarında oldukça kullanışlıdır.
SELECT
GETDATE() AS 'GETDATE',
--DATEPART, istenen tarih parçasını integer olarak döndürür
DATEPART(YEAR, GETDATE()) AS 'Yıl',
DATEPART(QUARTER, GETDATE()) AS 'Çeyrek',
DATEPART(MONTH, GETDATE()) AS 'Ay',
DATEPART(ISO_WEEK, GETDATE()) AS 'ISO Hafta',
DATEPART(WEEK, GETDATE()) AS 'Hafta',
DATEPART(DAY, GETDATE()) AS 'Gün',
DATEPART(WEEKDAY, GETDATE()) AS 'Haftanın Günü',
DATEPART(HOUR, GETDATE()) AS 'Saat',
DATEPART(MINUTE, GETDATE()) AS 'Dakika',
DATEPART(SECOND, GETDATE()) AS 'Saniye',
DATEPART(MILLISECOND, GETDATE()) AS 'Milisaniye',
DATEPART(MICROSECOND, GETDATE()) AS 'Microsaniye',
DATEPART(NANOSECOND, GETDATE()) AS 'Nanosaniye',
--DATENAME, istenen tarih parçasını string olarak döndürür
DATENAME(YEAR, GETDATE()) AS 'Yıl',
DATENAME(QUARTER, GETDATE()) AS 'Çeyrek',
DATENAME(MONTH, GETDATE()) AS 'Ay',
DATENAME(ISO_WEEK, GETDATE()) AS 'ISO Hafta',
DATENAME(WEEK, GETDATE()) AS 'Hafta',
DATENAME(DAY, GETDATE()) AS 'Gün',
DATENAME(WEEKDAY, GETDATE()) AS 'Haftanın Günü',
DATENAME(HOUR, GETDATE()) AS 'Saat',
DATENAME(MINUTE, GETDATE()) AS 'Dakika',
DATENAME(SECOND, GETDATE()) AS 'Saniye',
DATENAME(MILLISECOND, GETDATE()) AS 'Milisaniye',
DATENAME(MICROSECOND, GETDATE()) AS 'Microsaniye',
DATENAME(NANOSECOND, GETDATE()) AS 'Nanosaniye'
Bu günkü yazıda, SQL Server tarih ve zaman fonksiyonlarının temel özelliklerine değinerek size bir başlangıç noktası sunmaya çalıştık ve hızlı bir kaynak oluşturmak istedik. Fonksiyonlar hakkında daha geniş bilgiye ulaşmak isteyenler Microsoft Learn SQL Server dokümanlarından faydalanabilirler. Bir sonraki yazıda görüşmek üzere..