Neden Excel, SQL, Python ve JavaScript Aynı Tarih İçin Farklı Hafta Numaraları Veriyor?
Python'da bir hafta numarası hesaplıyorsunuz, sonra aynı tarihi Excel'de açıyorsunuz ve sayılar uyuşmuyor. Bir SQL sorgusu çalıştırıyorsunuz ve üçüncü bir sonuç alıyorsunuz. İnternette arama yapıyorsunuz ve dördüncü bir sonuç buluyorsunuz.
Bu bir hata değil. Her aracın farklı şekilde aldığı bir tasarım kararı — ve çoğu bunu yeterince belgelemez.
Yaygın kullanımda en az iki büyük hafta numaralama sistemi, her birinde çeşitli varyasyonlar ve evrensel bir varsayılan bulunmamaktadır. Farklılıkları anladıktan sonra, uyuşmazlıkları hata ayıklamak saniyeler alır. O zamana kadar çıldırtıcıdır.
İki Ana Sistem
ISO 8601 (Avrupa'nın çoğunda, uluslararası iş dünyasında ve bilimsel bağlamlarda kullanılır)
- Haftalar Pazartesi'den Pazar'a koşar
- 1. hafta, yılın ilk Perşembe'sini içeren haftadır
- Bir yılın 52 veya 53 haftası vardır
- Hafta yılı, sınırlarda takvim yılından farklılık gösterebilir
ABD / basit sistem (Kuzey Amerika'da ve birçok elektronik tablo varsayılanında kullanılır)
- Haftalar Pazar'dan Cumartesi'ye koşar (veya bazen Pazartesi'den Pazar'a, yerel ayara bağlı olarak)
- 1. hafta, 1 Ocak'ı içeren haftadır
- 1 Ocak hangi güne denk gelirse gelsin her zaman 1. haftadadır
- Yıl sonundaki kısmi haftalar yüksek sayılar alır (52 veya 53), sonraki yıla aktarılmaz
Pratik fark en belirgin şekilde Aralık sonunda ve Ocak başında ortaya çıkar.
| Tarih | ISO haftası | ABD haftası (Paz başlangıcı) |
|---|---|---|
| 28 Aralık 2025 | Hafta 52, 2025 | Hafta 53, 2025 |
| 29 Aralık 2025 | Hafta 1, 2026 | Hafta 53, 2025 |
| 30 Aralık 2025 | Hafta 1, 2026 | Hafta 53, 2025 |
| 31 Aralık 2025 | Hafta 1, 2026 | Hafta 53, 2025 |
| 1 Ocak 2026 | Hafta 1, 2026 | Hafta 1, 2026 |
| 2 Ocak 2026 | Hafta 1, 2026 | Hafta 1, 2026 |
| 3 Ocak 2026 | Hafta 1, 2026 | Hafta 1, 2026 |
| 4 Ocak 2026 | Hafta 1, 2026 | Hafta 2, 2026 |
29–31 Aralık 2025, 2026'nın ISO 1. haftasına düşer — çünkü o haftanın Perşembe günü (1 Ocak) 2026'dadır. ABD sistemi bunları 2025'in 53. haftasında tutar.
Excel: WEEKNUM ile ISOWEEKNUM
Excel'in iki ayrı işlevi vardır; bu, çoğu araçtan daha açıktır.
WEEKNUM(tarih, [dönüş_türü]) — Yapılandırılabilir hafta başlangıcıyla ABD tarzı
dönüş_türü bağımsız değişkeni haftanın hangi günde başladığını kontrol eder:
| dönüş_türü | Hafta başlar |
|---|---|
| 1 (varsayılan) | Pazar |
| 2 | Pazartesi |
| 11 | Pazartesi |
| 21 | Pazartesi (ISO 8601) |
dönüş_türü = 21, WEEKNUM'ı ISO gibi davranmaya zorlar — ancak bu kötü belgelenmiştir ve çoğu kullanıcı bunun varlığından habersizdir.
ISOWEEKNUM(tarih) — ISO 8601, her zaman Pazartesi başlangıcı, Perşembe kuralı
Bu, Excel 2013'te eklendi. Doğru ISO hafta numarasını döndürür ve belirsiz değildir.
=ISOWEEKNUM("2025-12-31") → 1 (2026'nın 1. haftası)
=WEEKNUM("2025-12-31", 1) → 53 (2025'in 53. haftası, Pazar başlangıcı)
=WEEKNUM("2025-12-31", 2) → 53 (2025'in 53. haftası, Pazartesi başlangıcı)
=WEEKNUM("2025-12-31", 21) → 1 (ISO uyumlu, ISOWEEKNUM ile aynı)
Yaygın hata: ISO tabanlı bir sistemle karşılaştırırken varsayılan bağımsız değişkenlerle WEEKNUM kullanmak. Sayılar çoğu tarih için uyuşacak ama yıl sonunda sessizce ayrışacak.
Google Sheets: Aynı İşlevler, Aynı Uyarılar
Google Sheets'te de Excel ile aynı davranışa sahip WEEKNUM ve ISOWEEKNUM bulunur. Varsayılan WEEKNUM ABD tarzı, Pazar başlangıçlıdır. ISOWEEKNUM ISO 8601'dir.
Bir fark: Google Sheets, ISOWEEKNUM'ı YEAR ile birlikte kullandığınızda ISO hafta yılını döndürmede daha tutarlıdır. ISO hafta yılını döndüren tek bir yerleşik işlev yoktur — onu hesaplamanız gerekir.
Python: isocalendar() ISO'dur, Ama strftime('%W') Değildir
date.isocalendar() — ISO 8601, (yıl, hafta, gün_numarası) döndürür
from datetime import date
d = date(2025, 12, 31)
d.isocalendar()
# IsoCalendarDate(year=2026, week=1, weekday=3)
Döndürülen yılın ISO hafta yılı (2026) olduğuna dikkat edin, takvim yılı (2025) değil. Bu doğru ve önemlidir — haftayı etiketlemeniz gerekiyorsa iso_year kullanın, d.year değil.
strftime('%W') ve strftime('%U') — ABD tarzı, farklı hafta başlangıçları
d.strftime('%W') # Pazartesi başlangıcıyla hafta numarası → '52'
d.strftime('%U') # Pazar başlangıcıyla hafta numarası → '52'
d.strftime('%V') # ISO hafta numarası → '01'
d.strftime('%G') # ISO hafta yılı → '2026'
%V / %G kombinasyonu ISO doğrudur. %W / %U direktifleri ABD tarzındadır ve yıl sınırlarında ISO ile ayrışır.
# ISO karşılaştırması için yanlış — yıl sınırı uyuşmaz
hafta = int(d.strftime('%W'))
# ISO için doğru
iso_yil, iso_hafta, _ = d.isocalendar()
JavaScript: Yerleşik Yok, Kendiniz Yapın
JavaScript'in Date nesnesinin yerel hafta numarası yöntemi yoktur. ISO hesabını manuel yapmanız veya date-fns ya da dayjs gibi bir kitaplık kullanmanız gerekir.
Manuel ISO hafta hesabı:
function isoWeek(date) {
const d = new Date(date)
d.setHours(0, 0, 0, 0)
// Mevcut haftadaki Perşembe yılı belirler
d.setDate(d.getDate() + 3 - (d.getDay() + 6) % 7)
const jan4 = new Date(d.getFullYear(), 0, 4)
return 1 + Math.round(((d - jan4) / 86400000 - 3 + (jan4.getDay() + 6) % 7) / 7)
}
isoWeek(new Date('2025-12-31')) // 1
date-fns kullanarak:
import { getISOWeek, getISOWeekYear } from 'date-fns'
getISOWeek(new Date('2025-12-31')) // 1
getISOWeekYear(new Date('2025-12-31')) // 2026
Yaygın hata: Basit bir Math.ceil(dayOfYear / 7) hesabı yazmak ve buna hafta numarası demek. Bu ne ISO ne de ABD standardı sonuçlar verir.
SQL: Veritabanına Göre Değişir
Her büyük veritabanı hafta numaralarını farklı şekilde ele alır.
PostgreSQL — Varsayılan olarak ISO
SELECT EXTRACT(week FROM DATE '2025-12-31');
-- 1 döndürür (ISO haftası)
SELECT EXTRACT(isoyear FROM DATE '2025-12-31');
-- 2026 döndürür
MySQL / MariaDB — Çoklu modlar
-- Mod 3 ISO 8601'dir (Pazartesi başlangıcı, 1. haftada Perşembe)
SELECT WEEK('2025-12-31', 3); -- 1
-- Mod 0 (varsayılan) ABD tarzı, Pazar başlangıcı
SELECT WEEK('2025-12-31', 0); -- 53
SQL Server — Varsayılan olarak ISO değil
-- Varsayılan DATEPART(week, ...) ISO değil
SELECT DATEPART(week, '2025-12-31'); -- 53
-- ISO haftası: isowk veya iso_week kullanın
SELECT DATEPART(isowk, '2025-12-31'); -- 1
Hızlı Başvuru Tablosu
| Araç | ISO haftası | ABD haftası | Notlar |
|---|---|---|---|
| Excel | ISOWEEKNUM() veya WEEKNUM(d, 21) | WEEKNUM() varsayılan | ISOWEEKNUM 2013'te eklendi |
| Google Sheets | ISOWEEKNUM() | WEEKNUM() varsayılan | Excel ile aynı |
| Python | date.isocalendar()[1] veya %V | %W (Pzt) / %U (Paz) | ISO hafta yılı için %G kullanın |
| JavaScript | Manuel veya date-fns getISOWeek() | Manuel | Yerel hafta numarası yok |
| PostgreSQL | EXTRACT(week ...) | Yerleşik değil | Varsayılan ISO |
| MySQL | WEEK(d, 3) | WEEK(d) veya WEEK(d, 0) | Mod 3 = ISO |
| SQL Server | DATEPART(isowk, d) | DATEPART(week, d) | Varsayılan ABD |
| SQLite | Geçici çözüm gerekli | strftime('%W', d) | Yerel destek yok |
Pratikte Uyuşmazlıkları Nasıl Önlersiniz
Bir sistem seçin ve her yerde uygulayın. ISO, çoğu yeni sistem için daha iyi varsayılandır — uluslararası standarttır ve modern kitaplıkların çoğunun uyguladığı şeydir.
ISO hafta yılını her zaman hafta numarasıyla birlikte saklayın. 2026'nın 1. haftası ile 2025'in 1. haftası farklı haftalardır.
Yıl sınırı durumlarınızı açıkça kontrol edin. Uyuşmazlıkların oluştuğu tarihler 28–31 Aralık ve 1–3 Ocak'tır.
Şüphe durumunda tam tarihleri saklayın ve karşılaştırın. Hafta numaraları görüntüleme ve raporlama içindir, birincil anahtarlar veya birleştirmeler için değil.
Herhangi bir tarih için doğru ISO hafta numarasını kontrol etmek amacıyla ISO Hafta Numarası Hesaplayıcısı'nı kullanın.

