# PostgreSQL’de Sadece Hafta Sonlarını Seçmek: Tam Bir Kılavuz
Meta Açıklaması: PostgreSQL veritabanınızdan sadece hafta sonu kayıtlarını nasıl seçebilirsiniz? Bu kapsamlı rehber, yeni başlayanlardan ileri düzeye kadar adım adım PostgreSQL ile hafta sonu verilerini filtreleme yöntemlerini açıklıyor, gerçek dünya örnekleri ve performans optimizasyon ipuçları sunuyor.
Veri analizi yaparken, belirli bir zaman dilimindeki verileri filtrelemek sıkça ihtiyaç duyulan bir işlemdir. Örneğin, bir e-ticaret sitesinin hafta sonu satışlarını analiz etmek, pazarlama stratejilerini optimize etmek için çok önemli olabilir. Peki, PostgreSQL veritabanınızda depolanan verilerden sadece hafta sonu kayıtlarını nasıl seçersiniz? Bu makale, PostgreSQL kullanarak hafta sonu verilerini seçmenin farklı yöntemlerini, adım adım açıklamalar, gerçek dünya örnekleri ve performans optimizasyon tekniklerini kapsayan kapsamlı bir rehber sunmaktadır.
PostgreSQL Tarih Fonksiyonlarını Anlamak
PostgreSQL’de tarih ve zaman verilerini işlemek için güçlü fonksiyonlar mevcuttur. Hafta sonu kayıtlarını seçmek için EXTRACT fonksiyonunu kullanarak haftanın gününü belirleyebiliriz. EXTRACT(DOW FROM tarih_sutunu) ifadesi, tarih_sutunu sütunundaki tarihin haftanın kaçıncı günü olduğunu (0-Pazar, 1-Pazartesi, …, 6-Cumartesi) integer olarak döndürür. Bu bilgiyi kullanarak hafta sonu günlerini (Cumartesi ve Pazar) filtreleyebiliriz.
PostgreSQL’de Hafta Sonu Verilerini Seçme: Adım Adım Kılavuz
# Yeni Başlayanlar İçin: Basit Bir Örnek
Diyelim ki siparisler adında bir tablonuz var ve bu tabloda siparis_tarihi adında bir tarih sütunu bulunuyor. Sadece hafta sonu yapılan siparişleri seçmek için aşağıdaki sorguyu kullanabilirsiniz:
SELECT *
FROM siparisler
WHERE EXTRACT(DOW FROM siparis_tarihi) IN (0, 6);
Bu sorgu, siparis_tarihi sütunundaki haftanın gününü EXTRACT fonksiyonu ile alır ve IN (0, 6) koşulu ile Pazar (0) ve Cumartesi (6) günlerini seçer. Tüm tablo verilerini (SELECT *) seçer. Daha spesifik sütunlar seçmek isterseniz, SELECT * yerine ilgili sütun adlarını yazabilirsiniz. Örneğin, sadece sipariş ID’sini ve tarihini görmek isterseniz:
SELECT siparis_id, siparis_tarihi
FROM siparisler
WHERE EXTRACT(DOW FROM siparis_tarihi) IN (0, 6);
# Orta Seviye: Gerçek Dünya Örneği ve Optimizasyon İpuçları
Bir online kitap satış sitesinin, son bir aydaki hafta sonu satışlarını analiz etmek istediğini düşünelim. satislar adlı bir tabloda satis_tarihi ve satis_tutari sütunları bulunmaktadır. Aşağıdaki sorgu, son 30 gün içindeki hafta sonu satışlarını toplar:
SELECT SUM(satis_tutari) AS toplam_satis
FROM satislar
WHERE satis_tarihi >= NOW() - INTERVAL '30 day'
AND EXTRACT(DOW FROM satis_tarihi) IN (0, 6);
Bu sorgu, NOW() fonksiyonu ile günümüz tarihini alır ve INTERVAL '30 day' ile 30 gün öncesini hesaplar. WHERE koşulu ile hem tarih aralığını hem de hafta sonu günlerini filtreler. SUM() fonksiyonu ile toplam satış tutarını hesaplar ve AS toplam_satis ile bu sütuna bir isim verir.
Optimizasyon İpucu: EXTRACT(DOW FROM tarih_sutunu) ifadesi, özellikle büyük veritabanlarında performans sorunlarına yol açabilir. Eğer performans kritik ise, siparisler tablosuna yeni bir hafta_gunu sütunu ekleyip, bu sütunu güncel tutmak daha verimli olabilir. Bu sayede, sorgu EXTRACT fonksiyonunu kullanmak zorunda kalmaz ve daha hızlı çalışır. Bu işlem için bir trigger kullanabilirsiniz. [fatihsoysal.com](https://fatihsoysal.com) adresinden PostgreSQL trigger’ları hakkında daha fazla bilgi edinebilirsiniz.
# İleri Düzey: Performans Analizi ve Edge Case’ler
Çok büyük veritabanlarında, yukarıdaki yöntemler bile performans sorunlarına neden olabilir. Performans analizini EXPLAIN ANALYZE komutu ile yapabilirsiniz. Bu komut, sorguyu çalıştırmadan önce nasıl planlandığını ve ne kadar sürdüğünü gösterir. Eğer sorgu yavaşsa, indeksleme gibi optimizasyon tekniklerini kullanmanız gerekebilir. siparis_tarihi sütununa bir indeks eklemek, sorgu performansını önemli ölçüde artırabilir.
Edge Case: Bazı durumlarda, haftanın başlangıcının Pazar veya Pazartesi olarak tanımlandığı farklı takvim sistemleri kullanılıyor olabilir. EXTRACT(DOW FROM tarih_sutunu) fonksiyonunun hangi takvim sistemini kullandığını kontrol etmek ve buna göre sorguyu ayarlamak önemlidir. PostgreSQL’in varsayılan takvim sistemi ISO 8601’dir (haftanın başlangıcı Pazartesi’dir).
PostgreSQL’de Hafta Sonu Verilerini Seçmenin Alternatif Yöntemleri
EXTRACT fonksiyonuna alternatif olarak, TO_CHAR fonksiyonunu kullanarak haftanın gününü text olarak alabilirsiniz. Bu fonksiyon farklı dil ayarlarına göre haftanın gününü farklı şekillerde döndürebilir. Örneğin, Türkçe dil ayarında DY format kodu ile haftanın gününün kısaltılmış halini (Paz, Pzt, Sal, Çar, Per, Cum, Cmt) alabilirsiniz. Bu yaklaşım, EXTRACT fonksiyonuna göre daha az verimli olabilir.
SELECT *
FROM siparisler
WHERE TO_CHAR(siparis_tarihi, 'DY') IN ('Cmt', 'Paz');
Bu yaklaşımın dezavantajı, dil ayarlarına bağımlı olmasıdır. Farklı dil ayarlarında sorguyu değiştirmeniz gerekebilir.
Gerçek Dünya Vaka Analizi: Bir Otel Rezervasyon Sistemi
Bir otel rezervasyon sisteminde, hafta sonu rezervasyonlarının sayısını ve toplam gelirini hesaplamak istediğimizi varsayalım. rezervasyonlar adlı bir tabloda rezervasyon_tarihi ve fiyat sütunları bulunmaktadır. Aşağıdaki sorgu, son 6 aydaki hafta sonu rezervasyonlarının sayısını ve toplam gelirini hesaplar:
SELECT
COUNT(*) AS toplam_rezervasyon,
SUM(fiyat) AS toplam_gelir
FROM rezervasyonlar
WHERE rezervasyon_tarihi >= NOW() - INTERVAL '6 month'
AND EXTRACT(DOW FROM rezervasyon_tarihi) IN (0, 6);
Sonuç
PostgreSQL’de hafta sonu verilerini seçmek için farklı yöntemler mevcuttur. EXTRACT fonksiyonu en yaygın ve verimli yöntemlerden biridir. Ancak, büyük veritabanlarında performans sorunlarına yol açabilir. Bu durumda, indeksleme veya bir trigger kullanarak yeni bir sütun ekleme gibi optimizasyon teknikleri kullanılmalıdır. TO_CHAR fonksiyonu da alternatif bir yöntemdir ancak dil ayarlarına bağımlıdır ve EXTRACT fonksiyonuna göre daha az verimli olabilir. Doğru yöntemin seçimi, veritabanının büyüklüğü, performans gereksinimleri ve diğer faktörlere bağlıdır. Veri analizi yaparken, verimliliği ve doğruluğu sağlamak için doğru yöntemi seçmek önemlidir.
Sıkça Sorulan Sorular:
1. EXTRACT(DOW FROM tarih) fonksiyonu hangi günleri 0 ve 6 olarak döndürür? ISO 8601 standardına göre, 0 Pazar gününü, 6 ise Cumartesi gününü temsil eder.
2. Hafta sonu verilerini seçmek için başka hangi fonksiyonları kullanabilirim? DATE_PART fonksiyonu da EXTRACT fonksiyonuna benzer şekilde kullanılabilir.
3. Performans sorunlarını nasıl önleyebilirim? İndeksleme, trigger’lar ve sorgu optimizasyonu tekniklerini kullanarak performansı artırabilirsiniz.
4. Farklı takvim sistemlerini nasıl ele alabilirim? PostgreSQL’in takvim ayarlarını kontrol ederek ve sorguyu buna göre uyarlayarak farklı takvim sistemlerini yönetebilirsiniz.
5. Çok büyük bir veritabanım var. Hangi yöntemi kullanmalıyım? Büyük veritabanları için, performans analizi yaparak ve indeksleme gibi optimizasyon tekniklerini kullanarak en verimli yöntemi belirlemeniz gerekir.
Yazar: Fatih Soysal