Yazılım geliştirme ve veritabanı yönetiminde en çok zaman harcanan alanlardan biri tarih (DATE) ve zaman (DATETIME) verilerinin işlenmesi, filtrelenmesi ve raporlanmasıdır. Farklı ülkelerin tarih formatları, sistemler arası entegrasyonlar ve performans gereksinimleri, bizi SQL Server’ın güçlü tarih fonksiyonlarını derinlemesine öğrenmeye zorlar.

Bu rehberimizde, SQL Server (T-SQL) dünyasındaki tüm temel tarih fonksiyonlarını, CONVERT mimarisini, stil kodlarını ve modern dönüşüm tekniklerini zengin iş senaryolarıyla bir araya getiriyoruz.

1. Sistem Tarih ve Zamanını Alan Fonksiyonlar

Veritabanında o anki işlem zamanını yakalamak için kullanılan, aralarında hassasiyet ve standart farkları bulunan temel fonksiyonlar şunlardır:

  1. GETDATE(): En yaygın kullanılan fonksiyondur. Geçerli veritabanı sistemi tarih ve saatini YYYY-MM-DD HH:MM:SS.MMM formatında döndürür.
  2. CURRENT_TIMESTAMP: GETDATE() ile tamamen aynı işlevi görür ancak ANSI SQL standardına uygundur.
  3. SYSDATETIME(): SQL Server'ın üzerinde çalıştığı bilgisayarın tarih ve saatini çok daha yüksek bir milisaniye hassasiyetiyle (7 basamak) döndürür.
  4. GETUTCDATE(): Sunucunun yerel saati ne olursa olsun, küresel standart olan UTC (Coordinated Universal Time) zamanını döndürür. Türkiye, tüm yıl boyunca UTC+3 zaman diliminde yer aldığı için bu fonksiyon yerel saatimizden 3 saat geriyi gösterecektir.

SQL


SELECT
GETDATE() AS [GETDATE], -- Örn: 2026-06-06 14:30:45.123
CURRENT_TIMESTAMP AS [CURRENT_TIMESTAMP],-- Örn: 2026-06-06 14:30:45.123
SYSDATETIME() AS [SYSDATETIME], -- Örn: 2026-06-06 14:30:45.1234567
GETUTCDATE() AS [GETUTCDATE]; -- Örn: 2026-06-06 11:30:45.123 (UTC)

2. Parçalardan Tarih Oluşturma ve Tarihi Parçalara Ayırma

Bir tarihin içindeki sadece yıl, ay veya gün bilgisine ulaşmak ya da elimizdeki sayısal verilerden yeni bir tarih üretmek için şu metotları kullanırız:

YEAR(), MONTH() ve DAY()

Bu fonksiyonlar kendilerine parametre olarak geçilen tarih verisinin ilgili parçalarını tam sayı (INT) olarak koparıp alır.

SQL


DECLARE @Tarih DATETIME = '1920-04-23 10:15:00';

SELECT
YEAR(@Tarih) AS [Yıl], -- Çıktı: 1920
MONTH(@Tarih) AS [Ay], -- Çıktı: 4
DAY(@Tarih) AS [Gün]; -- Çıktı: 23

DATEPART()

YEAR veya MONTH fonksiyonlarının genişletilmiş halidir. Tarihin sadece yıl/ay/gününü değil; haftanın kaçıncı günü olduğunu (dw), yılın kaçıncı haftası olduğunu (wk) veya mikrosaniyesini sayısal olarak alabilmenizi sağlar.

SQL


-- Haftanın kaçıncı günü olduğunu öğrenme (Pazar = 1, Pazartesi = 2...)
SELECT DATEPART(dw, GETDATE()) AS [Haftanın Günü];

-- Yılın kaçıncı haftasında olduğumuzu bulma
SELECT DATEPART(wk, GETDATE()) AS [Yılın Haftası];

DATEFROMPARTS()

Elinizde ayrı ayrı bulunan Yıl, Ay ve Gün sayısal değerlerini birleştirerek resmi bir DATE veri tipi oluşturur. 3 parametre alır ve girilen değerler mantıksal sınırların dışındaysa hata fırlatır.

SQL


-- Yıl, Ay, Gün birleştirerek tarih üretme
SELECT DATEFROMPARTS(2026, 06, 06) AS [Oluşturulan Tarih]; -- Çıktı: 2026-06-06

3. Tarih Matematik Fonksiyonları: DATEADD() ve DATEDIFF()

Veritabanı programlamada en çok ihtiyaç duyulan işlemler, bir tarihe gün/ay/yıl eklemek veya iki tarih arasındaki farkı hesaplamaktır.

DATEADD(bölüm, miktar, tarih)

Belirtilen tarihin istenen bölümüne (yıl, ay, gün, saat vb.) verilen miktar kadar ekleme yapar. Negatif değer verilirse çıkarma işlemi gerçekleştirir.

SQL


-- Bugünün tarihine 23 yıl ekleme
SELECT DATEADD(year, 23, GETDATE()) AS [23 Yıl Sonra];

-- Fatura tarihine 15 gün vade ekleme
SELECT DATEADD(day, 15, '2026-06-06') AS [Son Ödeme Tarihi];

DATEDIFF(bölüm, başlangıç_tarihi, bitiş_tarihi)

İki tarih arasındaki zaman farkını, istenen zaman birimi (yıl, ay, gün, saat, dakika) cinsinden hesaplar.

SQL


-- Yaş Hesaplama Senaryosu
DECLARE @DogumTarihi DATETIME = '1995-08-15';
SELECT DATEDIFF(year, @DogumTarihi, GETDATE()) AS [Hesaplanan Yaş];

-- İş Senaryosu: Kıdem bazlı zam (3 yıldan fazla çalışanları bulma)
SELECT PersonelID, Adi, Soyadi, IseGirisTarihi
FROM Personeller
WHERE DATEDIFF(year, IseGirisTarihi, GETDATE()) > 3;

4. SQL CONVERT Fonksiyonu ve Stil Kodları Tablosu

Farklı sistemlerden gelen veya dışarıya raporlanacak verileri metinsel formatlara dönüştürürken CONVERT imdadımıza yetişir. CAST fonksiyonundan farklı olarak CONVERT, tarih biçimlendirme için stil kodlarını destekler.

Genel Sözdizimi

SQL


CONVERT ( hedef_veri_tipi [ ( uzunluk ) ] , ifade , [ stil_kodu ] )

Aşağıdaki canlı simülatör yardımıyla hedef veri tipini ve stil kodlarını değiştirerek SQL Server’ın üreteceği çıktıları anında test edebilirsiniz:







Tüm Tarih ve Zaman Stil Kodları Rehberi

💡 İpucu: Stil kodlarında 2 haneli yıl (YY) çıktısı almak için 0-14 arası kodlar, 4 haneli tam yıl (YYYY) çıktısı almak için ise bu kodlara 100 eklenmiş halleri kullanılır (Örn: 3 -> dd/mm/yy, 103 -> dd/mm/yyyy).
Stil Kodu (YY)Stil Kodu (YYYY)Standart / KültürÇıktı Formatı (Örnek: 6 Haziran 2026)En Sık Kullanım Alanı
0100Varsayılan (Default)Haz 6 2026 2:30PMSistem Log İncelemeleri
1101ABD (US)06/06/2026Amerika Menşeli Entegrasyonlar
2102ANSI2026.06.06Klasik Dosya/Klasör Adlandırma
3103İngiltere/Fransa (UK/FR)06/06/2026Avrupa ve TR Yaygın Kullanımı
4104Almanya (German)06.06.2026Türkiye Resmi Formatı
5105İtalya (Italian)06-06-2026Ayrıştırıcı olarak tire kullanımı
6106Kısa Gün-Ay-Yıl06 Haz 2026Gösterge Panelleri (Dashboard)
7107Kısa Ay Gün, YılHaz 06, 2026Metin Odaklı Yazılı Raporlar
8 / -108Sadece Zaman14:30:45HH:MM:SS Saat Filtreleri
9109Detaylı VarsayılanHaz 6 2026 2:30:45:123PMMilisaniyeli Log Kayıtları
10110USA (Tireli)06-06-2026Alternatif ABD Formatı
11111Japonya (Japan)2026/06/06Asya Pazarı Entegrasyonları
12112ISO (Sıkışık)20260606İndeks Dostu Sıralama Verisi
13113Avrupa (Milisaniyeli)06 Haz 2026 14:30:45:123Endüstriyel Zaman Damgası
-114Detaylı Zaman14:30:45:123Performans Ölçüm Çıktıları
20120ODBC Kanonik2026-06-06 14:30:45Veritabanları Arası Veri Transferi
21121ODBC (Milisaniyeli)2026-06-06 14:30:45.123Standart Sistem Günlükleri
-126ISO86012026-06-06T14:30:45.123REST API ve JSON Transferleri
-127ISO8601 (Z Saat Dilimli)2026-06-06T14:30:45.123ZKüresel Zaman (UTC) Entegrasyonu

5. Doğrulama ve Güvenli Dönüşüm: ISDATE ve TRY_CONVERT

Dış dünyadan veritabanımıza gelen veriler her zaman kurallara uygun olmayabilir. Hatalı biçimlendirilmiş bir metni doğrudan dönüştürmeye çalışmak tüm sorgunun çökmesine yol açar.

ISDATE() ile Kontrol Etme

Bir metnin geçerli bir tarih ifadesi olup olmadığını denetler. Metin tarihe dönüştürülebiliyorsa 1, dönüştürülemiyorsa 0 sonucunu verir.

SQL


SELECT ISDATE('2026-06-06') AS [Sonuc1]; -- Çıktı: 1 (Geçerli)
SELECT ISDATE('EcolBilisim') AS [Sonuc2]; -- Çıktı: 0 (Geçersiz)

TRY_CONVERT() ile Hataları Yönetme

Standart CONVERT fonksiyonu geçersiz bir değer gördüğünde çalışma zamanı hatası fırlatırken, TRY_CONVERT fonksiyonu işlemi durdurmaz; başarısız dönüşümler için geriye güvenli bir şekilde NULL döndürür.

SQL


-- Sorgu çökmez, güvenli bir şekilde NULL değer üretilir
SELECT TRY_CONVERT(DATETIME, 'Geçersiz_Tarih_Metni', 104) AS [Dönüşüm Durumu];

6. Veritabanı Geliştiricileri İçin Performans ve Tasarım Notları

  1. İndeksleri Korumak (Sargable Sorgu): WHERE filtrelemelerinde tablo sütununu bir fonksiyonun (Örn: CONVERT, YEAR) içine sarmak, SQL Server'ın o sütundaki indeksleri kullanamamasına (Index Scan) yol açar.
  2. Hatalı Yaklaşım: WHERE CONVERT(VARCHAR(10), KayitTarihi, 104) = '06.06.2026'
  3. Anlamlı tarih aralıkları vererek indeksi doğrudan kullanın:
  4. Target Doğru Yaklaşım: WHERE KayitTarihi >= '2026-06-06' AND KayitTarihi < '2026-06-07'
  5. Doğru Uzunluğu Seçmek: Tarih verisini metne dönüştürürken hedef VARCHAR uzunluğunu doğru ayarlayın. Örneğin, 120 stil kodu 19 karakter üretir. Eğer VARCHAR(10) tanımlarsanız saat kısmı otomatik olarak kırpılacaktır.

7. İleri Düzey Senaryolar ve Kod Örnekleri

Sık karşılaşılan iş ihtiyaçlarına yönelik optimize edilmiş T-SQL kod blokları:

Senaryo A: Tarihten Saat Bilgisini Tamamen Arındırmak

Bazen DATETIME sütunundaki saat bilgisini sıfırlayıp (00:00:00.000) sadece güne odaklanmak istersiniz. SQL Server 2008 sonrasında doğrudan DATE tipine convert etmek en performanslı yöntemdir.

SQL


-- Saat bilgisini silip saf DATE tipine dönüştürme
SELECT CONVERT(DATE, GETDATE()) AS 'Sadece Tarih';

-- Eski tip SQL Server'lar için VARCHAR üzerinden saat sıfırlama (104 = GG.AA.YYYY)
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 104), 104) AS 'Saat Sıfırlanmış Datetime';

Senaryo B: VARCHAR Uzunluğunun Kritik Etkisi (Veri Kırpma)

Hedef veri tipinin uzunluğu, stil kodunun ürettiği çıktıyı doğrudan sınırlar. Bu durumu lehinize ya da hata kaynağı olarak kullanabilirsiniz:

SQL


-- Stil 120 normalde 19 karakter üretir: '2026-06-06 14:30:45'
-- Uzunluğu 10 karakter vererek bilerek saat kısmını kırpıyoruz:
SELECT CONVERT(VARCHAR(10), GETDATE(), 120) AS 'Kırpılmış YYYY-MM-DD';

-- HATA RİSKİ: Eğer stil 120 kullanıp VARCHAR(5) deseydiniz '2026-' çıktısı alırdınız!

8. Modern Alternatifler: TRY_CONVERT ve PARSE

Gelişen SQL Server sürümleriyle birlikte hataları engellemek ve esnekliği artırmak için yeni fonksiyonlar aileye katıldı.

1. TRY_CONVERT ile Çalışma Zamanı (Runtime) Hatalarını Engelleme

Kullanıcılardan veya dış kaynaklardan (Excel, text dosyası) gelen tarih verileri her zaman temiz olmayabilir. Standart CONVERT geçersiz bir string gördüğünde sorgunun çökmesine (Conversion failed...) neden olur. TRY_CONVERT ise çökme yerine NULL değer üretir.

SQL


-- Standart CONVERT hata verir ve sorgu durur:
-- SELECT CONVERT(DATETIME, 'EcolBilisim2026', 104);

-- TRY_CONVERT ise güvenlidir, hata yerine NULL döner:
SELECT TRY_CONVERT(DATETIME, 'EcolBilisim2026', 104) AS 'Dönüşüm Sonucu';

2. PARSE ve TRY_PARSE ile Kültür (Culture) Bazlı Dönüşüm

Eğer elinizdeki metin "6 June 2026" veya "6 Haziran 2026" gibi yerel dilde yazılmış bir metinse, stil kodları yetersiz kalır. Burada devreye .NET Framework altyapısını kullanan PARSE girer.

SQL


-- İngilizce metni tarihe çevirme
SELECT PARSE('June 6, 2026' AS DATETIME USING 'en-US') AS 'US Çıktısı';

-- Türkçe metni tarihe çevirme
SELECT PARSE('6 Haziran 2026' AS DATETIME USING 'tr-TR') AS 'TR Çıktısı';
⚠️ Performans Notu: PARSE ve TRY_PARSE fonksiyonları .NET CLR katmanına ihtiyaç duyduğundan, milyonlarca satırlık büyük tablolarda CONVERT fonksiyonuna kıyasla daha yavaş çalışır. Yoğun işlemlerde CONVERT tercih edilmelidir.

9. Veritabanı Yöneticileri (DBA) İçin Altın Kurallar

  1. Sargable Sorgular Yazın (Performans Kuralları): WHERE koşullarında tablonun kendi sütununa asla CONVERT uygulamayın.
  2. YOL (YAPMAYIN): WHERE CONVERT(VARCHAR(10), KayitTarihi, 104) = '06.06.2026' (Bu işlem tablodaki tüm indeksleri iptal eder - Index Scan tetikler).
  3. DOĞRU YOL: WHERE KayitTarihi >= '2026-06-06 00:00:00' AND KayitTarihi < '2026-06-07 00:00:00'
  4. Uluslararası Projelerde Ortak Dil: Küresel çapta hizmet veren veya vermeyi hedefleyen yazılımlarda tarihleri metne dönüştürürken her zaman saat dilimini koruyan 126 (ISO8601) kodunu kullanmaya özen gösterin.


Ecol Bilişim teknik blog ailesi olarak veri yönetimi ve SQL mimarisi süreçlerinizde başarılar dileriz! Merak ettiğiniz soruları yorumlar kısmından bize iletebilirsiniz.