SQL Tarih Fonksiyonları: PostgreSQL, SQL Server, MySQL ve Oracle Karşılaştırması
Bugünün tarihi, 30 gün geriye gitme, ay başına yuvarlama, yıl/ay çekme, tarih farkı ve biçimlendirme: en sık gereken 6 tarih işlemi, dört veritabanının kendi sözdizimiyle yan yana.
Tarih fonksiyonları, SQL lehçeleri arasında en çok ayrışan bölgedir. PostgreSQL'de yazdığınız sorgu Oracle'da patlar, SQL Server'da çalışan MySQL'de başka sonuç verir. Bu sayfa, en sık ihtiyaç duyulan altı işlemi dört motorun kendi sözdizimiyle yan yana koyan bir başvuru kaynağı; yer imlerine eklenmek için yazıldı.
1. Bugünün tarihi ve şu anki zaman
-- PostgreSQL
SELECT CURRENT_DATE, NOW();
-- SQL Server
SELECT CAST(GETDATE() AS date), GETDATE();
-- MySQL
SELECT CURDATE(), NOW();
-- Oracle
SELECT TRUNC(SYSDATE), SYSDATE FROM dual;2. Tarihe gün/ay ekleme ve çıkarma
-- PostgreSQL
SELECT CURRENT_DATE - INTERVAL '30 days';
SELECT CURRENT_DATE + INTERVAL '3 months';
-- SQL Server
SELECT DATEADD(DAY, -30, CAST(GETDATE() AS date));
SELECT DATEADD(MONTH, 3, CAST(GETDATE() AS date));
-- MySQL
SELECT DATE_SUB(CURDATE(), INTERVAL 30 DAY);
SELECT DATE_ADD(CURDATE(), INTERVAL 3 MONTH);
-- Oracle
SELECT TRUNC(SYSDATE) - 30 FROM dual;
SELECT ADD_MONTHS(TRUNC(SYSDATE), 3) FROM dual;3. Ay veya yıl başına yuvarlama (truncate)
"Bu ayın başından beri" tipi filtrelerin temeli budur ve dördü dört ayrı yol izler:
-- PostgreSQL
SELECT date_trunc('month', CURRENT_DATE);
-- SQL Server (2022+)
SELECT DATETRUNC(month, GETDATE());
-- SQL Server (daha eski sürümler)
SELECT DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1);
-- MySQL (yerleşik trunc yok; ilk gün kalıbı)
SELECT DATE_FORMAT(CURDATE(), '%Y-%m-01');
-- Oracle
SELECT TRUNC(SYSDATE, 'MM') FROM dual;4. Tarihten yıl, ay, gün çekme
-- PostgreSQL / Oracle (standart)
SELECT EXTRACT(YEAR FROM siparis_tarihi),
EXTRACT(MONTH FROM siparis_tarihi)
FROM siparisler;
-- SQL Server
SELECT YEAR(siparis_tarihi), MONTH(siparis_tarihi), DAY(siparis_tarihi)
FROM siparisler;
-- MySQL (ikisi de çalışır)
SELECT YEAR(siparis_tarihi), EXTRACT(MONTH FROM siparis_tarihi)
FROM siparisler;5. İki tarih arasındaki fark
-- PostgreSQL (date - date = gün sayısı)
SELECT teslim_tarihi - siparis_tarihi AS gun_farki FROM siparisler;
-- SQL Server (dikkat: önce birim, sonra küçük tarih)
SELECT DATEDIFF(DAY, siparis_tarihi, teslim_tarihi) FROM siparisler;
-- MySQL (dikkat: SQL Server'ın TERSİ sıra, birim yok)
SELECT DATEDIFF(teslim_tarihi, siparis_tarihi) FROM siparisler;
-- Oracle (date - date = gün sayısı, küsuratlı olabilir)
SELECT teslim_tarihi - siparis_tarihi FROM siparisler;6. Tarihi metne biçimlendirme
-- PostgreSQL / Oracle
SELECT TO_CHAR(siparis_tarihi, 'YYYY-MM') FROM siparisler;
-- SQL Server
SELECT FORMAT(siparis_tarihi, 'yyyy-MM') FROM siparisler;
-- MySQL
SELECT DATE_FORMAT(siparis_tarihi, '%Y-%m') FROM siparisler;Bir bütünlük notu: bu kalıpları tarih aralığı filtreleriyle birleştirirken yarı-açık aralık kuralını (başlangıç dahil, bitiş hariç) unutmayın; ayrıntısı tarih filtreleme rehberimizde. Saat dilimi de ayrı bir dert: kolon UTC tutuyorsa "bugün" hesabını aynı dilimde yapmadığınız sürece gece yarısı kayıtları güne yanlış düşer.
Sık sorulan sorular
- GETDATE ile SYSDATETIME arasındaki fark ne?
- İkisi de SQL Server'da şu anki zamanı verir; GETDATE datetime (3 ms hassasiyet), SYSDATETIME datetime2 (100 ns) döndürür. Yeni kodda SYSDATETIME tercih edilir ama raporlama için ikisi de iş görür.
- MySQL'de date_trunc neden yok?
- MySQL bu fonksiyonu hiç eklemedi; topluluk DATE_FORMAT ile ilk-gün kalıbını kullanır. MariaDB'nin yeni sürümlerinde benzer fonksiyonlar var ama taşınabilirlik istiyorsanız kalıba sadık kalın.
- Oracle'da tarih sabiti nasıl yazılır?
- En güvenlisi ANSI biçimi: DATE '2026-01-01'. TO_DATE('01/01/2026','DD/MM/YYYY') da çalışır ama oturum ayarına bağımlı biçimlerden kaçının.
- Bu farkları ezberlemek zorunda mıyım?
- Değilsiniz; bu sayfa tam da o yüzden var. Bir adım ötesi, lehçeyi hiç düşünmemek: PerSight'a sorunuzu Türkçe yazarsınız, bağlı olduğunuz motora uygun tarih fonksiyonlarını o seçer ve ürettiği SQL'i size gösterir.
Kaynaklar
İlgili yazılar
- SQL'de Tarih Aralığına Göre Filtreleme (BETWEEN Tuzağı Dahil)Bu ay, son 30 gün, geçen çeyrek: SQL'de tarih aralığı sorgulamanın güvenli yolu. BETWEEN'in saat bilgisiyle neden yanıltıcı olduğu ve PostgreSQL, SQL Server, MySQL, Oracle karşılıkları.
- SQL GROUP BY: Gruplayıp Toplamayı AnlamakAylık ciro, müşteri başına sipariş, kategoriye göre adet: GROUP BY ile toplama. COUNT/SUM/AVG, WHERE ile HAVING farkı ve MySQL'in ONLY_FULL_GROUP_BY tuzağı, gerçek örneklerle.
- Text-to-SQL Nedir? Doğal Dilden SQL'e Çeviri, Sade AnlatımText-to-SQL (NL2SQL), doğal dildeki bir soruyu çalıştırılabilir SQL sorgusuna çeviren yapay zeka tekniğidir. Nasıl çalışır, sınırları neler, güvenli kullanım için nelere bakılır? Pazarlamasız bir rehber.