Ana içeriğe geç
Kesit SQL
Temel · Fonksiyonlar

Tarihlerle filtreleme ve gruplama: aralıklar, aylar, haftanın günleri

Yarı açık tarih aralığı, saatli sütun tuzağı, ay/yıl/çeyrek gruplama.

Uygulamada aç, 7 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ç.

Altın kural: yarı açık aralık

“2024 yılı” filtresini yazmanın en güvenli yolu başlangıç dahil, bitiş hariç aralıktır:

SELECT COUNT(*) AS siparis
FROM orders
WHERE order_date >= '2024-01-01'
  AND order_date <  '2025-01-01';

Neden BETWEEN '2024-01-01' AND '2024-12-31' değil? Sütun saat de içeriyorsa (2024-12-31 14:30) bu değer '2024-12-31''den büyüktür ve kaçar. Yarı açık aralık her iki durumda da doğrudur.

Fonksiyon tuzağıWHERE YEAR(order_date) = 2024 doğru sonuç verir ama sütun bir fonksiyona girdiği için indeks kullanılamaz; büyük tablolarda yavaştır. Aralık yazmak hem doğru hem hızlıdır.

Saatli sütunda tek gün

SELECT COUNT(*) AS olay
FROM web_events
WHERE event_time >= '2024-11-29'
  AND event_time <  '2024-11-30';

Döneme göre gruplama

DönemSQL ServerPostgreSQLMySQLBigQuery
Yıl-ay metniFORMAT(d, 'yyyy-MM')TO_CHAR(d, 'YYYY-MM')DATE_FORMAT(d, '%Y-%m')FORMAT_DATE('%Y-%m', d)
Ay başı tarihiDATETRUNC(month, d)DATE_TRUNC('month', d)DATE_FORMAT(d, '%Y-%m-01')DATE_TRUNC(d, MONTH)
ÇeyrekDATEPART(quarter, d)EXTRACT(QUARTER FROM d)QUARTER(d)EXTRACT(QUARTER FROM d)
SELECT strftime('%Y', order_date) AS yil,
       CASE WHEN CAST(strftime('%m', order_date) AS INTEGER) <= 3 THEN 1 WHEN CAST(strftime('%m', order_date) AS INTEGER) <= 6 THEN 2 WHEN CAST(strftime('%m', order_date) AS INTEGER) <= 9 THEN 3 ELSE 4 END AS ceyrek,
       COUNT(*) AS siparis
FROM orders
WHERE order_date >= '2023-01-01'
GROUP BY strftime('%Y', order_date), CASE WHEN CAST(strftime('%m', order_date) AS INTEGER) <= 3 THEN 1 WHEN CAST(strftime('%m', order_date) AS INTEGER) <= 6 THEN 2 WHEN CAST(strftime('%m', order_date) AS INTEGER) <= 9 THEN 3 ELSE 4 END
ORDER BY yil, ceyrek;

Göreli tarihler

“Son 30 gün” gibi filtrelerde bugünün tarihi kullanılır: SQL Server DATEADD(day, -30, GETDATE()), PostgreSQL CURRENT_DATE - 30, MySQL CURDATE() - INTERVAL 30 DAY, BigQuery DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY). Bu uygulamadaki veri 2024 sonunda bittiği için alıştırmalarda sabit bir referans tarih (2024-12-31) kullanıyoruz.

SELECT COUNT(*) AS siparis
FROM orders
WHERE order_date > date('2024-12-31', '-30 days');
Alıştırmalara geç (7)