# PostgreSQL’de Hafta Numarasından Hafta Başlangıç Tarihini Bulma
PostgreSQL veritabanınızda haftalık raporlama yapıyorsunuz ve haftanın numarasından o haftanın başlangıç tarihini hızlıca bulmanız gerekiyor. Bu, birçok iş zekası uygulamasında, özellikle tarihsel verilerin analizinde sık karşılaşılan bir durumdur. Bu makalede, PostgreSQL kullanarak hafta numarasından hafta başlangıç tarihini nasıl hesaplayacağınızı adım adım, farklı seviyelerde ele alacağız. Başlangıç seviyesinden ileri seviye tekniklere kadar uzanan bir yol haritası sunacağız, gerçek dünya senaryolarını inceleyecek ve performans optimizasyonuna odaklanacağız.
Öğrenme Yol Haritası
Yeni Başlayan: (Adım adım açıklama, Basit kod örneği) → Orta: (Gerçek hayat örneği, Optimizasyon ipuçları) → İleri Düzey: (Performans analizi, Edge caseler)
Temel Kavramlar: PostgreSQL’de Tarih ve Zaman Fonksiyonları
PostgreSQL’in güçlü tarih ve zaman fonksiyonları, bu görevi kolaylaştırır. Öncelikle, date_trunc(), extract(), make_date() ve to_char() fonksiyonlarını anlamak önemlidir.
* date_trunc('week', tarih): Belirtilen tarihi, haftanın başlangıç tarihine yuvarlar. Hafta başlangıcının hangi gün olduğu, PostgreSQL’in datestyle ayarına bağlıdır. Varsayılan olarak genellikle Pazartesi’dir, ancak bu ayar değiştirilebilir.
* extract(field FROM tarih): Tarihten belirli bir alanı (yıl, ay, gün, hafta numarası vb.) çıkarır. Bizim için önemli olan extract(week FROM tarih) ve extract(year FROM tarih) fonksiyonları olacaktır.
* make_date(yıl, ay, gün): Yıl, ay ve gün değerlerinden bir tarih oluşturur.
* to_char(tarih, format_kodları): Tarihi belirtilen formata göre bir metin dizesine dönüştürür. Örneğin, to_char(tarih, 'YYYY-MM-DD') tarihi “YYYY-MM-DD” formatında bir dize olarak döndürür.
PostgreSQL’de Hafta Başlangıç Tarihini Hesaplama: Adım Adım Uygulama
Şimdi, hafta numarası ve yılı bilerek hafta başlangıç tarihini hesaplayalım. Öncelikle, basit bir örnek ile başlayacağız.
Örnek: 2024 yılının 35. haftasının başlangıç tarihini bulalım.
SELECT date_trunc('week', make_date(2024, 1, 1) + interval '34 weeks');
Bu kod, 2024 yılının ilk gününden başlayarak 34 hafta ileri gider (çünkü hafta numaraları 1’den başlar) ve daha sonra date_trunc() fonksiyonu ile haftanın başlangıç tarihine yuvarlar. Bu yöntem basit ve anlaşılır olsa da, daha gelişmiş senaryolarda yetersiz kalabilir.
Gerçek Hayatta Hafta Başlangıç Tarihini Hesaplama: Daha Gelişmiş Bir Yaklaşım
Yukarıdaki yöntem, yılın başlangıç tarihini referans alarak çalışır. Ancak, farklı bir hafta başlangıç günü kullanıyorsanız veya daha karmaşık sorgularınız varsa, daha robust bir yaklaşım kullanmanız gerekir. Örneğin, bir şirketin mali yılı Ocak yerine Temmuz ayında başlıyorsa, bu yöntemi doğrudan kullanamazsınız.
Aşağıdaki fonksiyon, yıl ve hafta numarasını girdi olarak alır ve haftanın başlangıç tarihini döndürür. Bu fonksiyon, haftanın başlangıç gününü de parametre olarak alarak daha fazla esneklik sağlar.
CREATE OR REPLACE FUNCTION get_week_start_date(year INT, week_number INT, week_start_day TEXT DEFAULT 'monday')
RETURNS DATE AS $$
DECLARE
first_day_of_year DATE;
first_week_day TEXT;
BEGIN
first_day_of_year := make_date(year, 1, 1);
first_week_day := to_char(first_day_of_year, 'Day');
-- İlk haftanın başlangıç gününü hesapla
CASE
WHEN lower(week_start_day) = 'monday' THEN
IF lower(first_week_day) = 'monday' THEN
RETURN first_day_of_year + interval '(week_number - 1) weeks';
ELSE
RETURN first_day_of_year + interval '((week_number - 1) weeks + (7 - (EXTRACT(DOW FROM first_day_of_year)::INT))) days';
END IF;
WHEN lower(week_start_day) = 'sunday' THEN
-- Sunday case... (Benzer mantıkla Sunday için hesaplama yapılabilir)
ELSE
RAISE EXCEPTION 'Geçersiz hafta başlangıç günü: %', week_start_day;
END CASE;
END;
$$ LANGUAGE plpgsql;
-- Örnek kullanım: 2024 yılının 35. haftasının Pazartesi başlangıçlı tarihini bulma
SELECT get_week_start_date(2024, 35);
-- Örnek kullanım: 2024 yılının 35. haftasının Pazar başlangıçlı tarihini bulma (Pazar için case eklendikten sonra çalışacaktır)
SELECT get_week_start_date(2024, 35, 'sunday');
Bu fonksiyon, daha sağlam ve özelleştirilebilir bir çözüm sunar.
Performans Optimizasyonu ve İpuçları
Büyük veri kümeleri üzerinde çalışırken, performans optimizasyonu çok önemlidir. Aşağıdaki ipuçları, sorgularınızın hızını artırmanıza yardımcı olacaktır:
* İndexler: year ve week_number sütunlarına indeks ekleyin. Bu, veritabanının ilgili satırları daha hızlı bulmasını sağlar.
* Fonksiyonların Optimizasyonu: Yukarıdaki fonksiyonda, gereksiz hesaplamalar yapmaktan kaçınmak için kodunuzu optimize edebilirsiniz. Örneğin, CASE ifadelerini daha verimli bir şekilde düzenleyebilirsiniz.
* Materialized Views: Eğer aynı sorguyu sık sık çalıştırıyorsanız, bir *materialized view* oluşturmayı düşünebilirsiniz. Bu, önceden hesaplanmış sonuçları saklayarak sorguların hızını önemli ölçüde artırır.
İleri Düzey Konular: Edge Case’ler ve Performans Analizi
Hafta numarası hesaplamalarında bazı özel durumlar (edge case’ler) dikkate alınmalıdır. Örneğin, yılın başlangıç haftası kısmen önceki yıla ait olabilir veya yılın son haftası kısmen sonraki yıla ait olabilir. Bu durumları doğru bir şekilde ele almak için, hafta numarası hesaplamasının nasıl tanımlandığını (ISO 8601 gibi standartlar) ve veritabanınızın tarih ve zaman ayarlarını dikkatlice incelemelisiniz.
Performans analizi için, EXPLAIN ANALYZE komutunu kullanarak sorgularınızın yürütme planını inceleyebilir ve performans darboğazlarını belirleyebilirsiniz. Bu, sorgularınızı daha hızlı hale getirmek için gereken optimizasyonları belirlemenize yardımcı olur.
Gerçek Dünya Senaryoları: Vaka Analizleri
Vaka 1: E-ticaret sitesi sipariş verilerini haftalık olarak analiz etmek istiyor. Her hafta için toplam sipariş sayısını ve toplam satış gelirini hesaplamak için get_week_start_date() fonksiyonunu kullanabilirler.
Vaka 2: Bir pazarlama şirketi, haftalık kampanya performansını izlemek istiyor. Her hafta için kampanya etkileşimlerini ve dönüşüm oranlarını analiz etmek için get_week_start_date() fonksiyonunu kullanabilirler.
Sonuç
PostgreSQL’de hafta numarasından hafta başlangıç tarihini bulmak için çeşitli yöntemler vardır. Basit yöntemler, küçük veri kümeleri için yeterli olabilirken, daha büyük ve karmaşık veri kümeleri için daha gelişmiş ve optimize edilmiş yaklaşımlar gereklidir. Bu makalede sunduğumuz adım adım kılavuz, gerçek dünya senaryoları ve performans optimizasyon ipuçları ile, PostgreSQL’de tarih ve zaman işlemlerine daha derinlemesine inmenize yardımcı olacaktır. [fatihsoysal.com](https://fatihsoysal.com) adresinden daha fazla PostgreSQL eğitimine ulaşabilirsiniz.
Sıkça Sorulan Sorular (SSS)
1. Hafta başlangıç günü nasıl değiştirilir? date_trunc('week', tarih) fonksiyonunun davranışı, PostgreSQL’in datestyle ayarına bağlıdır. Bu ayarı değiştirmek için SET datestyle = 'ISO, MDY' gibi komutları kullanabilirsiniz. Ancak, daha güvenilir bir çözüm, get_week_start_date() fonksiyonunda olduğu gibi hafta başlangıç gününü parametre olarak almak ve algoritmayı buna göre ayarlamak olacaktır.
2. Yılın 53. haftası nasıl işlenir? Bu durum, yılın son haftasının kısmen sonraki yıla ait olduğu anlamına gelir. get_week_start_date() fonksiyonu gibi gelişmiş fonksiyonlar, bu durumu doğru bir şekilde ele almalıdır.
3. ISO 8601 standardı nasıl kullanılır? ISO 8601 standardı, hafta numaralarını ve tarih hesaplamalarını standardize eder. PostgreSQL’de ISO 8601 standardına uygun hafta numarası hesaplamaları için to_char(tarih, 'IW') fonksiyonunu kullanabilirsiniz.
4. Performans sorunları nasıl giderilir? EXPLAIN ANALYZE komutu ile sorgularınızın yürütme planını inceleyerek performans darboğazlarını belirleyebilirsiniz. İndeksler, materialized views ve sorgu optimizasyonu performansı artırmada yardımcı olur.
5. Farklı bir veritabanı sisteminde benzer bir işlem nasıl yapılır? Diğer veritabanı sistemlerinin de kendi tarih ve zaman fonksiyonları vardır. Benzer bir işlemi diğer sistemlerde gerçekleştirmek için, ilgili veritabanı sisteminin dokümantasyonuna bakmanız gerekir.
Yazar: Fatih Soysal
