Analistin en çok kullandığı fonksiyonlar
Satış trendleri, kohortlar, büyüme oranları… hepsi tarihle başlar. Tarih fonksiyonları SQL türleri arasında en çok fark gösteren alandır. Aşağıdaki her kod kutusunda SQL türü sekmesini değiştirerek aynı işin nasıl yazıldığını gör.
Yıl, ay, gün parçaları
| İşlem | SQL Server | PostgreSQL / Oracle | MySQL | SQLite |
|---|---|---|---|---|
| Yıl | YEAR(d) | EXTRACT(YEAR FROM d) | YEAR(d) | strftime('%Y', d) |
| Ay (sayı) | MONTH(d) | EXTRACT(MONTH FROM d) | MONTH(d) | strftime('%m', d) |
| “2024-05” biçimi | FORMAT(d, 'yyyy-MM') | TO_CHAR(d, 'YYYY-MM') | DATE_FORMAT(d, '%Y-%m') | strftime('%Y-%m', d) |
| Haftanın günü | DATEPART(weekday, d) | EXTRACT(DOW FROM d) / TO_CHAR(d,'D') | DAYOFWEEK(d) | strftime('%w', d) |
| Bugün | GETDATE() | CURRENT_DATE / SYSDATE | CURDATE() | date('now') |
SELECT strftime('%Y-%m', order_date) AS ay,
COUNT(*) AS siparis
FROM orders
GROUP BY strftime('%Y-%m', order_date)
ORDER BY ay;
Tarih aritmetiği
| İşlem | SQL Server | PostgreSQL | MySQL | Oracle |
|---|---|---|---|---|
| 7 gün ekle | DATEADD(day, 7, d) | d + INTERVAL '7 day' | DATE_ADD(d, INTERVAL 7 DAY) | d + 7 |
| 1 ay ekle | DATEADD(month, 1, d) | d + INTERVAL '1 month' | DATE_ADD(d, INTERVAL 1 MONTH) | ADD_MONTHS(d, 1) |
| Ayın ilk günü | DATEFROMPARTS(YEAR(d), MONTH(d), 1) | DATE_TRUNC('month', d) | DATE_FORMAT(d, '%Y-%m-01') | TRUNC(d, 'MM') |
| Gün farkı | DATEDIFF(day, d1, d2) | d2 - d1 | DATEDIFF(d2, d1) | d2 - d1 |
SELECT date('2024-01-15', '+1 month') AS bir_ay_sonra,
date('2024-03-15', 'start of month') AS ay_basi,
date('2024-03-15', '-7 days') AS bir_hafta_once,
julianday('2024-12-31') - julianday('2024-01-01') AS gun_farki;
Ay sonu tuzağı31 Ocak'a 1 ay eklemek: SQL Server, PostgreSQL, MySQL ve Oracle
2024-02-29 (ayın son günü) verir; SQLite ise taşmayı sonraki aya aktarır ve 2024-03-02 verir. Ay sonu tarihleriyle çalışırken SQL türünün davranışını mutlaka test et.SQL Server'da DATEDIFF
DATEDIFF(month, '2024-01-31', '2024-02-01') sonucu 1'dir; çünkü DATEDIFF geçen tam süreyi değil, aşılan sınır sayısını sayar. Yaş hesaplarken bu fark önemlidir.Çalışanların işe girişinden bu yana geçen gün:
SELECT first_name, hire_date,
CAST(julianday('2025-01-01') - julianday(hire_date) AS INTEGER) AS gun
FROM employees
ORDER BY gun DESC
LIMIT 5;