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.
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önem | SQL Server | PostgreSQL | MySQL | BigQuery |
|---|---|---|---|---|
| Yıl-ay metni | FORMAT(d, 'yyyy-MM') | TO_CHAR(d, 'YYYY-MM') | DATE_FORMAT(d, '%Y-%m') | FORMAT_DATE('%Y-%m', d) |
| Ay başı tarihi | DATETRUNC(month, d) | DATE_TRUNC('month', d) | DATE_FORMAT(d, '%Y-%m-01') | DATE_TRUNC(d, MONTH) |
| Çeyrek | DATEPART(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');