Tarih tipleri
| Tip | Örnek | Not |
|---|---|---|
DATE | 2024-05-17 | Sadece tarih (3 bayt) |
DATETIME2(n) | 2024-05-17 14:30:00.0000000 | Önerilen tarih-saat tipi |
DATETIME | 2024-05-17 14:30:00.000 | Eski tip, 3 ms hassasiyet |
DATETIMEOFFSET | ... +03:00 | Saat dilimiyle |
Temel fonksiyonlar
SELECT CAST(GETDATE() AS DATE) AS bugun,
DATEADD(day, 30, '2024-05-17') AS otuz_gun_sonra,
DATEADD(month, -1, '2024-03-31') AS bir_ay_once,
EOMONTH('2024-02-10') AS ay_sonu,
DATEFROMPARTS(2024, 12, 1) AS aralik_basi,
DATEPART(quarter, '2024-05-17') AS ceyrek,
DATENAME(month, '2024-05-17') AS ay_adi;
DATEADD(month, -1, '2024-03-31') sonucu 2024-02-29'dur: SQL Server ay sonunu korur.
Aylık rapor: FORMAT ve YEAR
SELECT FORMAT(order_date, 'yyyy-MM') AS ay,
COUNT(*) AS siparis
FROM orders
WHERE YEAR(order_date) = 2024
GROUP BY FORMAT(order_date, 'yyyy-MM')
ORDER BY ay;
Performans notu
WHERE YEAR(order_date) = 2024 okunaklıdır ama indeks kullanılamaz. Büyük tablolarda WHERE order_date >= '2024-01-01' AND order_date < '2025-01-01' yaz. FORMAT da yavaş bir fonksiyondur; milyonlarca satırda DATEFROMPARTS(YEAR(d), MONTH(d), 1) veya 2022'deki DATETRUNC(month, d) tercih edilir.Türkçe gün ve ay adları
SELECT FORMAT(order_date, 'dddd', 'tr-TR') AS gun,
COUNT(*) AS siparis
FROM orders
GROUP BY FORMAT(order_date, 'dddd', 'tr-TR'), DATEPART(weekday, order_date)
ORDER BY DATEPART(weekday, order_date);
FORMAT'ın üçüncü parametresi kültürdür: 'tr-TR' Türkçe ad verir. DATENAME ise sunucunun dil ayarını (varsayılan İngilizce) kullanır.
DATEDIFF sınır sayar
SELECT DATEDIFF(year, '2024-12-31', '2025-01-01') AS yil_farki,
DATEDIFF(month, '2024-01-31', '2024-02-01') AS ay_farki,
DATEDIFF(day, '2024-01-01', '2024-12-31') AS gun_farki;
İlk iki sonuç 1'dir: DATEDIFF geçen tam süreyi değil, aşılan yıl/ay sınırını sayar. Yaş veya kıdem hesaplarken gün farkını 365.25'e bölmek ya da doğum gününün geçip geçmediğini kontrol etmek gerekir.
CONVERT ile biçimli tarih metni
SELECT TOP 3 order_date,
CONVERT(VARCHAR(10), order_date, 104) AS tr_bicim,
CONVERT(VARCHAR(10), order_date, 103) AS ingiliz_bicim,
CONVERT(VARCHAR(8), order_date, 112) AS iso_kompakt
FROM orders
ORDER BY order_id;
| Stil | Biçim |
|---|---|
| 104 | dd.mm.yyyy (Türkiye) |
| 103 | dd/mm/yyyy |
| 23 | yyyy-mm-dd |
| 112 | yyyymmdd |
| 120 | yyyy-mm-dd hh:mi:ss |