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:
GETDATE(): En yaygın kullanılan fonksiyondur. Geçerli veritabanı sistemi tarih ve saatiniYYYY-MM-DD HH:MM:SS.MMMformatında döndürür.CURRENT_TIMESTAMP:GETDATE()ile tamamen aynı işlevi görür ancak ANSI SQL standardına uygundur.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.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
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
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
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
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
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
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
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ı |
| 0 | 100 | Varsayılan (Default) | Haz 6 2026 2:30PM | Sistem Log İncelemeleri |
| 1 | 101 | ABD (US) | 06/06/2026 | Amerika Menşeli Entegrasyonlar |
| 2 | 102 | ANSI | 2026.06.06 | Klasik Dosya/Klasör Adlandırma |
| 3 | 103 | İngiltere/Fransa (UK/FR) | 06/06/2026 | Avrupa ve TR Yaygın Kullanımı |
| 4 | 104 | Almanya (German) | 06.06.2026 | Türkiye Resmi Formatı |
| 5 | 105 | İtalya (Italian) | 06-06-2026 | Ayrıştırıcı olarak tire kullanımı |
| 6 | 106 | Kısa Gün-Ay-Yıl | 06 Haz 2026 | Gösterge Panelleri (Dashboard) |
| 7 | 107 | Kısa Ay Gün, Yıl | Haz 06, 2026 | Metin Odaklı Yazılı Raporlar |
8 / - | 108 | Sadece Zaman | 14:30:45 | HH:MM:SS Saat Filtreleri |
| 9 | 109 | Detaylı Varsayılan | Haz 6 2026 2:30:45:123PM | Milisaniyeli Log Kayıtları |
| 10 | 110 | USA (Tireli) | 06-06-2026 | Alternatif ABD Formatı |
| 11 | 111 | Japonya (Japan) | 2026/06/06 | Asya Pazarı Entegrasyonları |
| 12 | 112 | ISO (Sıkışık) | 20260606 | İndeks Dostu Sıralama Verisi |
| 13 | 113 | Avrupa (Milisaniyeli) | 06 Haz 2026 14:30:45:123 | Endüstriyel Zaman Damgası |
- | 114 | Detaylı Zaman | 14:30:45:123 | Performans Ölçüm Çıktıları |
| 20 | 120 | ODBC Kanonik | 2026-06-06 14:30:45 | Veritabanları Arası Veri Transferi |
| 21 | 121 | ODBC (Milisaniyeli) | 2026-06-06 14:30:45.123 | Standart Sistem Günlükleri |
- | 126 | ISO8601 | 2026-06-06T14:30:45.123 | REST API ve JSON Transferleri |
- | 127 | ISO8601 (Z Saat Dilimli) | 2026-06-06T14:30:45.123Z | Kü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
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
6. Veritabanı Geliştiricileri İçin Performans ve Tasarım Notları
- İndeksleri Korumak (Sargable Sorgu):
WHEREfiltrelemelerinde 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. - ❌ Hatalı Yaklaşım:
WHERE CONVERT(VARCHAR(10), KayitTarihi, 104) = '06.06.2026' - Anlamlı tarih aralıkları vererek indeksi doğrudan kullanın:
- Target Doğru Yaklaşım:
WHERE KayitTarihi >= '2026-06-06' AND KayitTarihi < '2026-06-07' - Doğru Uzunluğu Seçmek: Tarih verisini metne dönüştürürken hedef
VARCHARuzunluğunu doğru ayarlayın. Örneğin,120stil kodu 19 karakter üretir. EğerVARCHAR(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
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
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
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
⚠️ Performans Notu:PARSEveTRY_PARSEfonksiyonları.NET CLRkatmanına ihtiyaç duyduğundan, milyonlarca satırlık büyük tablolardaCONVERTfonksiyonuna kıyasla daha yavaş çalışır. Yoğun işlemlerdeCONVERTtercih edilmelidir.
9. Veritabanı Yöneticileri (DBA) İçin Altın Kurallar
- Sargable Sorgular Yazın (Performans Kuralları):
WHEREkoşullarında tablonun kendi sütununa aslaCONVERTuygulamayın. - YOL (YAPMAYIN):
WHERE CONVERT(VARCHAR(10), KayitTarihi, 104) = '06.06.2026'(Bu işlem tablodaki tüm indeksleri iptal eder - Index Scan tetikler). - DOĞRU YOL:
WHERE KayitTarihi >= '2026-06-06 00:00:00' AND KayitTarihi < '2026-06-07 00:00:00' - 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.