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.
| Dato | ISO-uke | US-uke (søndag start) |
|---|---|---|
| 28. desember 2025 | Uke 52, 2025 | Uke 53, 2025 |
| 29. desember 2025 | Uke 1, 2026 | Uke 53, 2025 |
| 30. desember 2025 | Uke 1, 2026 | Uke 53, 2025 |
| 31. desember 2025 | Uke 1, 2026 | Uke 53, 2025 |
| 1. januar 2026 | Uke 1, 2026 | Uke 1, 2026 |
| 2. januar 2026 | Uke 1, 2026 | Uke 1, 2026 |
| 3. januar 2026 | Uke 1, 2026 | Uke 1, 2026 |
| 4. januar 2026 | Uke 1, 2026 | Uke 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_type | Uken starter på |
|---|---|
| 1 (standard) | søndag |
| 2 | mandag |
| 11 | mandag |
| 12 | tirsdag |
| 13 | onsdag |
| 14 | torsdag |
| 15 | fredag |
| 16 | lørdag |
| 17 | søndag |
| 21 | mandag (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øy | ISO-uke | US-uke | Merknad |
|---|---|---|---|
| Excel | ISOWEEKNUM() eller WEEKNUM(d, 21) | WEEKNUM() standard | ISOWEEKNUM kom i 2013 |
| Google Sheets | ISOWEEKNUM() | WEEKNUM() standard | Samme som Excel |
| Python | date.isocalendar()[1] eller %V | %W (man) / %U (søn) | Bruk %G for ISO-ukeår |
| JavaScript | Manuelt eller date-fns getISOWeek() | Manuelt | Ingen innebygd støtte |
| PostgreSQL | EXTRACT(week ...) | Ikke innebygd | ISO som standard |
| MySQL | WEEK(d, 3) | WEEK(d) eller WEEK(d, 0) | Modus 3 = ISO |
| SQL Server | DATEPART(isowk, d) | DATEPART(week, d) | Standard er US |
| SQLite | Workaround nødvendig | strftime('%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.