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átumISO hétUSA hét (vasárnap kezdettel)
2025. december 28.52. hét, 202553. hét, 2025
2025. december 29.1. hét, 202653. hét, 2025
2025. december 30.1. hét, 202653. hét, 2025
2025. december 31.1. hét, 202653. hét, 2025
2026. január 1.1. hét, 20261. hét, 2026
2026. január 2.1. hét, 20261. hét, 2026
2026. január 3.1. hét, 20261. hét, 2026
2026. január 4.1. hét, 20262. 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_typeA hét kezdete
1 (alapértelmezett)Vasárnap
2Hétfő
11Hétfő
12Kedd
13Szerda
14Csütörtök
15Péntek
16Szombat
17Vasárnap
21Hé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özISO hétUSA hétMegjegyzések
ExcelISOWEEKNUM() vagy WEEKNUM(d, 21)WEEKNUM() alapértelmezettAz ISOWEEKNUM 2013-ban lett hozzáadva
Google TáblázatokISOWEEKNUM()WEEKNUM() alapértelmezettUgyanaz mint Excel
Pythondate.isocalendar()[1] vagy %V%W (Hétfő) / %U (Vasárnap)%G használata ISO hét évéhez
JavaScriptManuális vagy date-fns getISOWeek()ManuálisNincs natív hétszám
PostgreSQLEXTRACT(week ...)Nincs beépítveAlapértelmezetten ISO
MySQLWEEK(d, 3)WEEK(d) vagy WEEK(d, 0)3. mód = ISO
SQL ServerDATEPART(isowk, d)DATEPART(week, d)Az alapértelmezett USA
SQLiteMegkerülő megoldás szükségesstrftime('%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.

Kapcsolódó cikkek