Miért adnak különböző hétszámokat az Excel, az SQL, a Python és a JavaScript ugyanarra a dátumra?
Kiszámítod egy hét számát Pythonban, majd megnyitod ugyanazt a dátumot Excelben, és a számok nem egyeznek. Futtatasz egy SQL-lekérdezést, és harmadik eredményt kapsz. Keresés közben negyediket találsz.
Ez nem hiba. Ez egy tervezési döntés, amelyet minden eszköz másképp hoz meg – és a legtöbb nem dokumentálja kellőképpen.
Legalább két fő hétszámozási rendszer van általánosan használatban, mindkettőn belül több változattal, és nincs univerzális alapértelmezett. Ha megérted a különbségeket, az eltérések hibakeresése másodperceket vesz igénybe. Addig viszont kínzók.
A két fő rendszer
ISO 8601 (Európában, a nemzetközi üzleti életben és tudományos kontextusokban használatos)
- A hetek hétfőtől vasárnapig tartanak
- Az 1. hét az az év első csütörtökét tartalmazó hét
- Egy évben 52 vagy 53 hét van
- Az „éves hét" éve eltérhet a naptári évtől a határok közelén
USA / egyszerű rendszer (Észak-Amerikában és sok táblázatkezelő alapértelmezettjeként használatos)
- A hetek vasárnaptól szombatig tartanak (vagy néha hétfőtől vasárnapig, a beállítástól függően)
- Az 1. hét az január 1-jét tartalmazó hét
- Január 1-je mindig az 1. hétben van, függetlenül attól, milyen napra esik
- Az év végi részleges hetek magas számokat kapnak (52 vagy 53), nem kerülnek át a következő évre
A gyakorlati különbség legélesebben december végén és január elején mutatkozik meg.
| Dátum | ISO hét | USA hét (vasárnap kezdettel) |
|---|---|---|
| 2025. december 28. | 52. hét, 2025 | 53. hét, 2025 |
| 2025. december 29. | 1. hét, 2026 | 53. hét, 2025 |
| 2025. december 30. | 1. hét, 2026 | 53. hét, 2025 |
| 2025. december 31. | 1. hét, 2026 | 53. hét, 2025 |
| 2026. január 1. | 1. hét, 2026 | 1. hét, 2026 |
| 2026. január 2. | 1. hét, 2026 | 1. hét, 2026 |
| 2026. január 3. | 1. hét, 2026 | 1. hét, 2026 |
| 2026. január 4. | 1. hét, 2026 | 2. hét, 2026 |
2025. december 29–31. az ISO 2026. 1. hetébe esik – mert az adott hét csütörtöke (január 1.) 2026-ban van. Az USA-rendszer a 2025. 53. hétben tartja őket.
Excel: WEEKNUM vs ISOWEEKNUM
Az Excelnek két külön függvénye van, ami egyértelműbb, mint a legtöbb eszköznél.
WEEKNUM(dátum, [return_type]) — USA-stílus, konfigurálható hét kezdettel
A return_type argumentum szabályozza, melyik nap kezdi a hetet:
| return_type | A hét kezdete |
|---|---|
| 1 (alapértelmezett) | Vasárnap |
| 2 | Hétfő |
| 11 | Hétfő |
| 12 | Kedd |
| 13 | Szerda |
| 14 | Csütörtök |
| 15 | Péntek |
| 16 | Szombat |
| 17 | Vasárnap |
| 21 | Hétfő (ISO 8601) |
A return_type = 21 az ISOWEEKNUM-hoz hasonlóan viselkedővé teszi a WEEKNUM-ot – de ez rosszul dokumentált, és a legtöbb felhasználó nem tud róla.
ISOWEEKNUM(dátum) — ISO 8601, mindig hétfős kezdet, csütörtöki szabály
Ezt az Excel 2013-ban adták hozzá. Visszaadja a helyes ISO hétszámot, és egyértelmű.
=ISOWEEKNUM("2025-12-31") → 1 (2026. 1. hét)
=WEEKNUM("2025-12-31", 1) → 53 (2025. 53. hét, vasárnap kezdet)
=WEEKNUM("2025-12-31", 2) → 53 (2025. 53. hét, hétfő kezdet)
=WEEKNUM("2025-12-31", 21) → 1 (ISO-kompatibilis, ugyanaz mint ISOWEEKNUM)
Gyakori hiba: A WEEKNUM alapértelmezett argumentumokkal való használata ISO-alapú rendszerrel való összehasonlításkor. A számok a legtöbb dátumra egyeznek, de csendesen eltérnek az év vége közelében.
Google Táblázatok: Ugyanazok a függvények, ugyanazok a fenntartások
A Google Táblázatokban is megvan mind a WEEKNUM, mind az ISOWEEKNUM, az Excellel megegyező viselkedéssel. Az alapértelmezett WEEKNUM USA-stílusú, vasárnap kezdettel. Az ISOWEEKNUM ISO 8601.
Egy különbség: a Google Táblázatok következetesebben adja vissza az ISO héténevet, ha az ISOWEEKNUM-ot a YEAR-rel együtt használod. Ha azt írod, =YEAR("2025-12-31"), 2025-öt kapsz, de az ISO hét 2026-hoz tartozik. Nincs olyan beépített függvény, amely az ISO hét évét adja vissza – ki kell számítanod:
=IF(ISOWEEKNUM(A1) > 50, IF(MONTH(A1) = 1, YEAR(A1) - 1, YEAR(A1)),
IF(ISOWEEKNUM(A1) < 3, IF(MONTH(A1) = 12, YEAR(A1) + 1, YEAR(A1)),
YEAR(A1)))
Ez terjengős. Ha komoly hét-év munkát végzel a Táblázatokban, gyakran tisztább Pythonba vagy SQL-be exportálni.
Python: az isocalendar() ISO, de a strftime('%W') nem
A Python datetime modulja kétféle megközelítést kínál.
date.isocalendar() — ISO 8601, visszaad (év, hét, hétköznap) értéket
from datetime import date
d = date(2025, 12, 31)
d.isocalendar()
# IsoCalendarDate(year=2026, week=1, weekday=3)
Figyeld meg, hogy a visszaadott év az ISO hét éve (2026), nem a naptári év (2025). Ez helyes és fontos – ha fel kell címkézni a hetet, az iso_year-t használd, ne a d.year-t.
strftime('%W') és strftime('%U') — USA-stílus, különböző hét kezdetek
d.strftime('%W') # Hétszám, hétfő mint a hét első napja → '52'
d.strftime('%U') # Hétszám, vasárnap mint a hét első napja → '52'
d.strftime('%V') # ISO hétszám → '01'
d.strftime('%G') # ISO hét éve → '2026'
A %V / %G kombináció ISO-helyes. A %W / %U irányelvek USA-stílusúak, és az ISO-tól az évhatároknál eltérnek.
Gyakori hiba: A d.strftime('%W') használata hétszámok lekérésekor, amikor a többi rendszer ISO-t használ. Az év 48+ hetére egyeznek, majd csendesen eltérnek decemberben és januárban.
# Helytelen ISO összehasonlításhoz – évhatárnál eltérés lesz
week = int(d.strftime('%W'))
# Helyes ISO-hoz
iso_year, iso_week, _ = d.isocalendar()
JavaScript: Nincs beépített, csináld magad
A JavaScript Date objektumának nincs natív hétszám metódusa. A Date.getDay() 0 (vasárnap) és 6 (szombat) között ad vissza értéket. Manuálisan kell kiszámítani, vagy olyan könyvtárat kell használni, mint a date-fns vagy dayjs.
Manuális ISO hét számítás:
function isoWeek(date) {
const d = new Date(date)
d.setHours(0, 0, 0, 0)
// Az aktuális hét csütörtöke határozza meg az évet
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)
}
function isoWeekYear(date) {
const d = new Date(date)
d.setDate(d.getDate() + 3 - (d.getDay() + 6) % 7)
return d.getFullYear()
}
isoWeek(new Date('2025-12-31')) // 1
isoWeekYear(new Date('2025-12-31')) // 2026
date-fns használatával:
import { getISOWeek, getISOWeekYear } from 'date-fns'
getISOWeek(new Date('2025-12-31')) // 1
getISOWeekYear(new Date('2025-12-31')) // 2026
Gyakori hiba: Egy egyszerű Math.ceil(évNapja / 7) számítás megírása és hétszámnak nevezése. Ez sem ISO, sem USA-szabványos eredményt nem ad – egy teljesen más (és helytelen) rendszer.
SQL: Az adatbázistól függ
Minden nagyobb adatbázis másképp kezeli a hétszámokat.
PostgreSQL — alapértelmezetten ISO
SELECT EXTRACT(week FROM DATE '2025-12-31');
-- Visszaad 1-et (ISO hét)
SELECT DATE_PART('week', DATE '2025-12-31');
-- Visszaad 1-et (ugyanaz, ISO)
-- ISO hét évének lekérése
SELECT EXTRACT(isoyear FROM DATE '2025-12-31');
-- Visszaad 2026-ot
A PostgreSQL EXTRACT(week ...) az ISO 8601-et követi. A hét éve az isoyear segítségével érhető el.
MySQL / MariaDB — több mód
-- A 3. mód az ISO 8601 (hétfő kezdet, az 1. hétben csütörtök van)
SELECT WEEK('2025-12-31', 3); -- 1
-- A 0. mód (alapértelmezett) USA-stílusú, vasárnap kezdettel
SELECT WEEK('2025-12-31', 0); -- 53
SELECT WEEK('2025-12-31'); -- 53 (alapértelmezett 0. mód)
-- YEARWEEK kombinált év+hét értéket ad vissza
SELECT YEARWEEK('2025-12-31', 3); -- 202601
A mód argumentum MySQL-ben kritikus, és 8 lehetőséget kínál (0–7). A 3. mód az ISO. Az alapértelmezett (0. mód) USA-stílusú. Ez gyakori hibaforrás az adatbázis-háttérrendszerek váltásakor.
SQL Server — alapértelmezetten nem ISO
-- Az alapértelmezett DATEPART(week, ...) nem ISO
SELECT DATEPART(week, '2025-12-31'); -- 53
-- ISO hét: isowk vagy iso_week használata
SELECT DATEPART(isowk, '2025-12-31'); -- 1
SELECT DATEPART(iso_week, '2025-12-31'); -- 1 (ugyanaz)
Az SQL Server alapértelmezett DATEPART(week, ...) USA-stílusú. Az isowk alias az ISO-verzió. Ha európai rendszerekkel összehasonlítható jelentéseket készítesz, mindig az isowk-t használd.
SQLite — nincs natív hét függvény
Az SQLite nem rendelkezik WEEKNUM-mal vagy EXTRACT(week ...)-kel. A strftime-ot kell használni:
-- '%W' hétfő kezdetű, USA-stílusú
SELECT strftime('%W', '2025-12-31'); -- 52
-- Az ISO héthez megkerülő megoldás szükséges
SELECT (strftime('%j', date('2025-12-31', '-3 days', 'weekday 4')) - 1) / 7 + 1;
-- 1
Az ISO megkerülő megoldás megkeresi a hét csütörtökjét, és onnan számol. Helyes, de nem nyilvánvaló.
Gyorslista
| Eszköz | ISO hét | USA hét | Megjegyzések |
|---|---|---|---|
| Excel | ISOWEEKNUM() vagy WEEKNUM(d, 21) | WEEKNUM() alapértelmezett | Az ISOWEEKNUM 2013-ban lett hozzáadva |
| Google Táblázatok | ISOWEEKNUM() | WEEKNUM() alapértelmezett | Ugyanaz mint Excel |
| Python | date.isocalendar()[1] vagy %V | %W (Hétfő) / %U (Vasárnap) | %G használata ISO hét évéhez |
| JavaScript | Manuális vagy date-fns getISOWeek() | Manuális | Nincs natív hétszám |
| PostgreSQL | EXTRACT(week ...) | Nincs beépítve | Alapértelmezetten ISO |
| MySQL | WEEK(d, 3) | WEEK(d) vagy WEEK(d, 0) | 3. mód = ISO |
| SQL Server | DATEPART(isowk, d) | DATEPART(week, d) | Az alapértelmezett USA |
| SQLite | Megkerülő megoldás szükséges | strftime('%W', d) | Nincs natív támogatás |
Hogyan kerüld el az eltéréseket a gyakorlatban
Válassz egy rendszert, és tartsd be mindenhol. Az ISO a legtöbb új rendszer számára jobb alapértelmezett – nemzetközileg szabványosított, és a legtöbb modern könyvtár ezt valósítja meg.
Mindig tárold az ISO hét évét a hétszám mellé. Az 1. hét, 2026 és az 1. hét, 2025 különböző hetek. Egy csak 1-et tároló oszlop az év nélkül nem egyértelmű.
Kifejezetten ellenőrizd az évhatár eseteit. December 28–31. és január 1–3. az a tartomány, ahol az eltérések előfordulnak. Futtasd a folyamatodat tesztdátumokkal ebből a tartományból a telepítés előtt.
Ha kétséges, tárold és hasonlítsd össze a teljes dátumokat. A hétszámok megjelenítésre és riportálásra valók, nem elsődleges kulcsoknak vagy joinokhoz. Ha rendszerek közötti adatokat illesztesz össze hétszám alapján, először alakítsd egy kanonikus dátummá (a hét hétfője).
Használd az ISO Hétszám Kalkulátort bármely dátum helyes ISO hétszámának ellenőrzésére, beleértve az éves naptár nézetet is.


