Ana içeriğe geç
Kesit SQL
Orta · T-SQL (SQL Server)

T-SQL tarih ve saat fonksiyonları

GETDATE, DATEADD, DATEDIFF, DATEPART, DATENAME, EOMONTH, DATEFROMPARTS, FORMAT, CONVERT.

Uygulamada aç, 3 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

Tarih tipleri

TipÖrnekNot
DATE2024-05-17Sadece tarih (3 bayt)
DATETIME2(n)2024-05-17 14:30:00.0000000Önerilen tarih-saat tipi
DATETIME2024-05-17 14:30:00.000Eski tip, 3 ms hassasiyet
DATETIMEOFFSET... +03:00Saat 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 notuWHERE 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;
StilBiçim
104dd.mm.yyyy (Türkiye)
103dd/mm/yyyy
23yyyy-mm-dd
112yyyymmdd
120yyyy-mm-dd hh:mi:ss
Alıştırmalara geç (3)