Hvorfor Excel, SQL, Python og JavaScript gir ulike ukenumre for samme dato

Du beregner et ukenummer i Python, åpner den samme datoen i Excel, og tallene stemmer ikke. Du kjører en SQL-spørring og får et tredje resultat. Du søker på nettet og finner et fjerde.

Dette er ikke en feil. Det er et designvalg som hvert verktøy gjør på sin egen måte — og de fleste dokumenterer det ikke tydelig nok.

Det finnes minst to store systemer for ukenummerering som brukes ofte, flere varianter innen hvert system, og ingen universell standardinnstilling. Når du først forstår forskjellene, tar det sekunder å feilsøke avvik. Før det er det frustrerende.

De to hovedsystemene

ISO 8601 (brukt i det meste av Europa, internasjonal business og vitenskapelige sammenhenger)

  • Uker går fra mandag til søndag
  • Uke 1 er uken som inneholder årets første torsdag
  • Et år har 52 eller 53 uker
  • Ukeåret kan avvike fra kalenderåret ved årsskifter

US-/enkelt system (brukt i Nord-Amerika og som standard i mange regneark)

  • Uker går fra søndag til lørdag (eller noen ganger mandag til søndag, avhengig av locale)
  • Uke 1 er uken som inneholder 1. januar
  • 1. januar er alltid i uke 1, uansett hvilken ukedag det er
  • Delvise uker ved årsslutt får høye numre (52 eller 53), og flyttes ikke til neste år

Den praktiske forskjellen merkes særlig i slutten av desember og begynnelsen av januar.

DatoISO-ukeUS-uke (søndag start)
28. desember 2025Uke 52, 2025Uke 53, 2025
29. desember 2025Uke 1, 2026Uke 53, 2025
30. desember 2025Uke 1, 2026Uke 53, 2025
31. desember 2025Uke 1, 2026Uke 53, 2025
1. januar 2026Uke 1, 2026Uke 1, 2026
2. januar 2026Uke 1, 2026Uke 1, 2026
3. januar 2026Uke 1, 2026Uke 1, 2026
4. januar 2026Uke 1, 2026Uke 2, 2026

29.–31. desember 2025 faller i ISO uke 1 av 2026 — fordi torsdagen i den uken (1. januar) ligger i 2026. US-systemet beholder dem i uke 53 av 2025.

Excel: WEEKNUM vs ISOWEEKNUM

Excel har to separate funksjoner, som er tydeligere enn i de fleste verktøy.

WEEKNUM(date, [return_type]) — US-stil, med konfigurerbar ukestart

Argumentet return_type styrer hvilken dag uken starter på:

return_typeUken starter på
1 (standard)søndag
2mandag
11mandag
12tirsdag
13onsdag
14torsdag
15fredag
16lørdag
17søndag
21mandag (ISO 8601)

return_type = 21 får WEEKNUM til å oppføre seg som ISO — men dette er dårlig dokumentert og mange vet ikke at det finnes.

ISOWEEKNUM(date) — ISO 8601, alltid mandag start, torsdagsregelen

Dette ble lagt til i Excel 2013. Den returnerer riktig ISO-ukenummer og er entydig.

=ISOWEEKNUM("2025-12-31")   → 1    (uke 1 i 2026)
=WEEKNUM("2025-12-31", 1)   → 53   (uke 53 i 2025, søndag start)
=WEEKNUM("2025-12-31", 2)   → 53   (uke 53 i 2025, mandag start)
=WEEKNUM("2025-12-31", 21)  → 1    (ISO-kompatibel, samme som ISOWEEKNUM)

Vanlig feil: Å bruke WEEKNUM med standardargumenter når du sammenligner med et ISO-basert system. Tallene vil stemme for de fleste datoer, men avviker stille ved årsskiftet.

Google Sheets: Samme funksjoner, samme fallgruver

Google Sheets har både WEEKNUM og ISOWEEKNUM med samme oppførsel som Excel. Standard WEEKNUM er US-stil med søndag som start. ISOWEEKNUM er ISO 8601.

En forskjell: Google Sheets er mer konsekvent med å vise ISO-ukeåret når du bruker ISOWEEKNUM sammen med YEAR. Hvis du skriver =YEAR("2025-12-31") får du 2025, men ISO-uken tilhører 2026. Det finnes ingen enkel innebygd funksjon som returnerer ISO-ukeår — du må beregne det:

=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)))

Dette er omstendelig. Hvis du jobber seriøst med ukeår i Sheets, er det ofte ryddigere å eksportere til Python eller SQL.

Python: isocalendar() er ISO, men strftime('%W') er det ikke

Pythons datetime-modul gir deg to ulike tilnærminger.

date.isocalendar() — ISO 8601, returnerer (year, week, weekday)

from datetime import date

d = date(2025, 12, 31)
d.isocalendar()
# IsoCalendarDate(year=2026, week=1, weekday=3)

Legg merke til at året som returneres er ISO-ukeåret (2026), ikke kalenderåret (2025). Dette er riktig og viktig — hvis du skal merke uken, bruk iso_year og ikke d.year.

strftime('%W') og strftime('%U') — US-stil, ulike ukestarter

d.strftime('%W')   # Ukenummer, mandag som første ukedag → '52'
d.strftime('%U')   # Ukenummer, søndag som første ukedag → '52'
d.strftime('%V')   # ISO-ukenummer → '01'
d.strftime('%G')   # ISO-ukeår → '2026'

Kombinasjonen %V / %G er ISO-korrekt. %W / %U er US-stil og vil avvike fra ISO ved årsskiftet.

Vanlig feil: Å bruke d.strftime('%W') for ukenummer når andre systemer bruker ISO. De stemmer i 48+ uker av året, og avviker så stille i desember og januar.

# Feil for ISO-sammenligning — gir mismatch ved årsskifte
week = int(d.strftime('%W'))

# Riktig for ISO
iso_year, iso_week, _ = d.isocalendar()

JavaScript: Ingen innebygd støtte — du må beregne selv

JavaScripts Date-objekt har ingen innebygd metode for ukenummer. Date.getDay() returnerer 0 (søndag) til 6 (lørdag). Du må beregne det manuelt eller bruke et bibliotek som date-fns eller dayjs.

Manuell beregning av ISO-ukenummer:

function isoWeek(date) {
  const d = new Date(date)
  d.setHours(0, 0, 0, 0)
  // Torsdag i inneværende uke bestemmer året
  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

Med date-fns:

import { getISOWeek, getISOWeekYear } from 'date-fns'

getISOWeek(new Date('2025-12-31'))      // 1
getISOWeekYear(new Date('2025-12-31'))  // 2026

Vanlig feil: Å skrive en enkel Math.ceil(dayOfYear / 7)-beregning og kalle det et ukenummer. Det gir verken ISO eller US-standard — det er et helt annet (og feil) system.

SQL: Det avhenger av databasen

Hver store database håndterer ukenummer litt forskjellig.

PostgreSQL — ISO som standard

SELECT EXTRACT(week FROM DATE '2025-12-31');
-- Returnerer 1 (ISO-uke)

SELECT DATE_PART('week', DATE '2025-12-31');
-- Returnerer 1 (samme, ISO)

-- Hent ISO-ukeår
SELECT EXTRACT(isoyear FROM DATE '2025-12-31');
-- Returnerer 2026

PostgreSQLs EXTRACT(week ...) følger ISO 8601. Ukeåret er tilgjengelig via isoyear.

MySQL / MariaDB — flere moduser

-- Modus 3 er ISO 8601 (mandag start, uke 1 har torsdag)
SELECT WEEK('2025-12-31', 3);   -- 1

-- Modus 0 (standard) er US-stil, søndag start
SELECT WEEK('2025-12-31', 0);   -- 53
SELECT WEEK('2025-12-31');      -- 53 (standard modus 0)

-- YEARWEEK returnerer kombinert år+uke
SELECT YEARWEEK('2025-12-31', 3);  -- 202601

Modusargumentet i MySQL er kritisk og har 8 alternativer (0–7). Modus 3 er ISO. Standard (modus 0) er US-stil. Dette er en vanlig kilde til bugs når man bytter databasebackend.

SQL Server — ikke ISO som standard

-- Standard DATEPART(week, ...) er ikke ISO
SELECT DATEPART(week, '2025-12-31');   -- 53

-- ISO-uke: bruk isowk eller iso_week
SELECT DATEPART(isowk, '2025-12-31');  -- 1
SELECT DATEPART(iso_week, '2025-12-31');  -- 1 (samme)

SQL Servers standard DATEPART(week, ...) bruker US-stil. Aliaset isowk er ISO-varianten. Hvis du bygger rapporter som sammenlignes med europeiske systemer, bruk alltid isowk.

SQLite — ingen innebygd ukefunksjon

SQLite har ikke WEEKNUM eller EXTRACT(week ...). Du bruker strftime:

-- '%W' er mandag start, US-stil
SELECT strftime('%W', '2025-12-31');   -- 52

-- ISO-uke krever en workaround
SELECT (strftime('%j', date('2025-12-31', '-3 days', 'weekday 4')) - 1) / 7 + 1;
-- 1

ISO-workarounden finner torsdagen i uken og teller derfra. Den er korrekt, men ikke åpenbar.

En snarvei-tabell

VerktøyISO-ukeUS-ukeMerknad
ExcelISOWEEKNUM() eller WEEKNUM(d, 21)WEEKNUM() standardISOWEEKNUM kom i 2013
Google SheetsISOWEEKNUM()WEEKNUM() standardSamme som Excel
Pythondate.isocalendar()[1] eller %V%W (man) / %U (søn)Bruk %G for ISO-ukeår
JavaScriptManuelt eller date-fns getISOWeek()ManueltIngen innebygd støtte
PostgreSQLEXTRACT(week ...)Ikke innebygdISO som standard
MySQLWEEK(d, 3)WEEK(d) eller WEEK(d, 0)Modus 3 = ISO
SQL ServerDATEPART(isowk, d)DATEPART(week, d)Standard er US
SQLiteWorkaround nødvendigstrftime('%W', d)Ingen innebygd støtte

Slik unngår du avvik i praksis

Velg ett system og håndhev det overalt. ISO er som regel et bedre standardvalg for nye systemer — det er internasjonalt standardisert og det de fleste moderne biblioteker implementerer.

Lagre alltid ISO-ukeår sammen med ukenummeret. Uke 1 i 2026 og uke 1 i 2025 er ulike uker. En kolonne som bare lagrer 1 er tvetydig uten år.

Test årsskifte-tilfellene eksplisitt. Datoene 28.–31. desember og 1.–3. januar er der avvik oppstår. Kjør pipelinen med testdatoer i dette intervallet før du deployer.

Når du er i tvil, lagre og sammenlign hele datoer. Ukenumre er for visning og rapportering, ikke for primærnøkler eller joiner. Hvis du joine’r data på ukenummer på tvers av systemer, konverter først til en kanonisk dato (mandagen i uken).

Bruk ISO-ukenummer-kalkulatoren for å sjekke riktig ISO-ukenummer for hvilken som helst dato, inkludert full årskalender-visning.