ஒரே தேதிக்கு Excel, SQL, Python, JavaScript ஏன் வேறுபட்ட வார எண்களை தருகின்றன

Python‑ல் வார எண் கணக்கிடுகிறீர்கள். பிறகு அதே தேதியை Excel‑ல் திறக்கிறீர்கள் — எண்கள் பொருந்தவில்லை. SQL query ஓட்டினால் மூன்றாவது முடிவு. இணையத்தில் தேடினால் நான்காவது.

இது bug அல்ல. ஒவ்வொரு கருவியும் வேறுவிதமாக முடிவு செய்யும் ஒரு “design choice” — மேலும் பெரும்பாலானவை இதை போதுமான அளவு தெளிவாக ஆவணப்படுத்துவதில்லை.

பொதுவாகப் பயன்படும் குறைந்தது இரண்டு முக்கியமான வார எண் முறைகள் உள்ளன; ஒவ்வொன்றிலும் பல வேறுபாடுகள் உள்ளன; மேலும் அனைத்துக்கும் ஒரே “universal default” எதுவும் இல்லை. இந்த வேறுபாடுகளைப் புரிந்துகொண்டால், mismatch‑களை debug செய்வது சில விநாடிகளில் முடியும். இல்லையெனில் அது தலைவலி.

இரண்டு முக்கிய முறைகள்

ISO 8601 (ஐரோப்பாவின் பெரும்பாலான பகுதிகள், சர்வதேச வணிகம், மற்றும் அறிவியல் சூழல்களில் பயன்படும்)

  • வாரங்கள் திங்கள் முதல் ஞாயிறு வரை
  • ஆண்டின் முதல் வியாழனை (Thursday) உள்ளடக்கிய வாரமே வாரம் 1
  • ஒரு ஆண்டில் 52 அல்லது 53 வாரங்கள் இருக்கும்
  • எல்லை (boundary) பகுதிகளில் “week year” காலண்டர் ஆண்டில் இருந்து வேறுபடலாம்

US / எளிய முறை (வட அமெரிக்கா மற்றும் பல spreadsheet default‑களில் பயன்படும்)

  • வாரங்கள் ஞாயிறு முதல் சனி வரை (அல்லது locale‑ஐப் பொறுத்து திங்கள் முதல் ஞாயிறு வரை)
  • ஜனவரி 1‑ஐ உள்ளடக்கிய வாரமே வாரம் 1
  • ஜனவரி 1 எந்த நாளில் வந்தாலும் அது எப்போதும் வாரம் 1‑ல் இருக்கும்
  • ஆண்டின் முடிவில் இருக்கும் பகுதி வாரங்கள் உயர்ந்த எண்களாக (52 அல்லது 53) இருக்கும்; அடுத்த ஆண்டுக்கு மாற்றி ஒதுக்கப்படாது

நடைமுறை வேறுபாடு டிசம்பர் இறுதி மற்றும் ஜனவரி தொடக்கத்தில் தான் மிகவும் தெளிவாகத் தெரியும்.

தேதிISO வாரம்US வாரம் (Sun start)
December 28, 2025Week 52, 2025Week 53, 2025
December 29, 2025Week 1, 2026Week 53, 2025
December 30, 2025Week 1, 2026Week 53, 2025
December 31, 2025Week 1, 2026Week 53, 2025
January 1, 2026Week 1, 2026Week 1, 2026
January 2, 2026Week 1, 2026Week 1, 2026
January 3, 2026Week 1, 2026Week 1, 2026
January 4, 2026Week 1, 2026Week 2, 2026

December 29–31, 2025 ISO‑வில் 2026‑இன் வாரம் 1‑க்கு உட்படும் — ஏனெனில் அந்த வாரத்தின் வியாழன் (January 1) 2026‑ல் இருக்கிறது. US முறை அவற்றை 2025‑இன் வாரம் 53‑லே வைத்துக் கொள்கிறது.

Excel: WEEKNUM vs ISOWEEKNUM

Excel‑ல் இரண்டு தனி functions இருப்பது மற்ற கருவிகளைக் காட்டிலும் தெளிவானது.

WEEKNUM(date, [return_type]) — US‑style, வார தொடக்க நாளை மாற்றக்கூடியது

return_type argument எந்த நாள் வாரத்தைத் தொடங்குகிறது என்பதை கட்டுப்படுத்துகிறது:

return_typeWeek starts on
1 (default)Sunday
2Monday
11Monday
12Tuesday
13Wednesday
14Thursday
15Friday
16Saturday
17Sunday
21Monday (ISO 8601)

return_type = 21 வைத்தால் WEEKNUM ISO போல நடக்கும் — ஆனால் இது சரியாக ஆவணப்படுத்தப்படாததால் பெரும்பாலான பயனாளர்களுக்கு இது இருப்பதே தெரியாது.

ISOWEEKNUM(date) — ISO 8601, எப்போதும் Monday start, Thursday rule

இது Excel 2013‑ல் சேர்க்கப்பட்டது. இது சரியான ISO வார எண்ணை தரும்; ambiguity இல்லை.

=ISOWEEKNUM("2025-12-31")   → 1    (week 1 of 2026)
=WEEKNUM("2025-12-31", 1)   → 53   (week 53 of 2025, Sunday start)
=WEEKNUM("2025-12-31", 2)   → 53   (week 53 of 2025, Monday start)
=WEEKNUM("2025-12-31", 21)  → 1    (ISO-compatible, same as ISOWEEKNUM)

பொதுவான தவறு: ISO அடிப்படையிலான அமைப்புடன் ஒப்பிடும்போது default arguments‑ுடன் WEEKNUM பயன்படுத்துவது. பெரும்பாலான தேதிகளில் எண்கள் பொருந்தும்; ஆனால் ஆண்டு முடிவில் அமைதியாக விலகிப் போகும்.

Google Sheets: அதே functions, அதே கவனிக்க வேண்டியவை

Google Sheets‑லும் Excel போலவே WEEKNUM மற்றும் ISOWEEKNUM உள்ளன. Default WEEKNUM US‑style, Sunday start. ISOWEEKNUM ISO 8601.

ஒரு வேறுபாடு: ISOWEEKNUM‑ஐ YEAR‑உடன் சேர்க்கும்போது ISO week year‑ஐ திருப்பி தருவதில் Google Sheets சற்று “consistent” ஆக நடக்கும். =YEAR("2025-12-31") என்றால் 2025 வரும்; ஆனால் அந்த ISO வாரம் 2026‑க்கு சொந்தமானது. ISO week year‑ஐ நேரடியாக தரும் ஒரு built‑in function இல்லை — கணக்கிட வேண்டும்:

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

இது நீளமானது. Sheets‑ல் week‑year வேலை அதிகமாகச் செய்ய வேண்டுமெனில், Python அல்லது SQL‑க்கு export செய்வது பல நேரங்களில் சுத்தமாக இருக்கும்.

Python: isocalendar() ISO; ஆனால் strftime('%W') ISO அல்ல

Python‑ன் datetime module இரண்டு வேறுபட்ட அணுகுமுறைகளை தருகிறது.

date.isocalendar() — ISO 8601, (year, week, weekday) திருப்பித் தரும்

from datetime import date

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

இங்கே திரும்ப வரும் year என்பது காலண்டர் ஆண்டு (2025) அல்ல; ISO week year (2026). இது சரியானதும் முக்கியமானதும் — வாரத்தை label செய்ய வேண்டுமென்றால் d.year அல்ல, iso_year‑ஐ பயன்படுத்துங்கள்.

strftime('%W') மற்றும் strftime('%U') — US‑style, வார தொடக்கம் வேறுபடும்

d.strftime('%W')   # Week number, Monday as first day of week → '52'
d.strftime('%U')   # Week number, Sunday as first day of week → '52'
d.strftime('%V')   # ISO week number → '01'
d.strftime('%G')   # ISO week year → '2026'

%V / %G இணைப்பு ISO‑க்குச் சரியானது. %W / %U US‑style; ஆண்டு எல்லைகளில் ISO‑வுடன் முரண்படும்.

பொதுவான தவறு: மற்ற அமைப்புகள் ISO பயன்படுத்தும் போது Python‑ல் d.strftime('%W') கொண்டு week number எடுப்பது. ஆண்டின் 48+ வாரங்களுக்கு அது பொருந்தும்; ஆனால் டிசம்பர்/ஜனவரியில் அமைதியாக விலகும்.

# Wrong for ISO comparison — year boundary will mismatch
week = int(d.strftime('%W'))

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

JavaScript: built-in இல்லை; நீங்களே எழுத வேண்டும்

JavaScript‑ன் Date object‑க்கு native week number method இல்லை. Date.getDay() 0 (Sunday) முதல் 6 (Saturday) வரை திருப்பித் தரும். Week number வேண்டுமெனில் கைமுறையாகக் கணக்கிட வேண்டும் அல்லது date-fns / dayjs போன்ற library பயன்படுத்த வேண்டும்.

Manual ISO week calculation:

function isoWeek(date) {
  const d = new Date(date)
  d.setHours(0, 0, 0, 0)
  // Thursday in current week decides the year
  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 பயன்படுத்துவது:

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

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

பொதுவான தவறு: Math.ceil(dayOfYear / 7) போல எளிய கணக்கை எழுதிவிட்டு அதை week number என்று அழைப்பது. இது ISO‑வுமல்ல, US‑standard‑உமல்ல — முற்றிலும் வேறு (மேலும் தவறான) முறை.

SQL: அது database‑ஐப் பொறுத்தது

ஒவ்வொரு முக்கிய database‑மும் வார எண்களை வேறுவிதமாக கையாளுகிறது.

PostgreSQL — default‑ஆக ISO

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

SELECT DATE_PART('week', DATE '2025-12-31');
-- Returns 1 (same, ISO)

-- Get ISO week year
SELECT EXTRACT(isoyear FROM DATE '2025-12-31');
-- Returns 2026

PostgreSQL‑ன் EXTRACT(week ...) ISO 8601‑ஐ பின்பற்றுகிறது. Week year‑ஐ isoyear மூலம் பெறலாம்.

MySQL / MariaDB — பல modes

-- Mode 3 is ISO 8601 (Monday start, week 1 has Thursday)
SELECT WEEK('2025-12-31', 3);   -- 1

-- Mode 0 (default) is US-style, Sunday start
SELECT WEEK('2025-12-31', 0);   -- 53
SELECT WEEK('2025-12-31');      -- 53 (default mode 0)

-- YEARWEEK returns combined year+week
SELECT YEARWEEK('2025-12-31', 3);  -- 202601

MySQL‑ல் mode argument முக்கியம்; 8 options (0–7) உள்ளன. Mode 3 ISO. Default (mode 0) US‑style. Database backend‑களை மாற்றும்போது இது பொதுவான bug காரணமாக இருக்கும்.

SQL Server — default ISO அல்ல

-- Default DATEPART(week, ...) is not ISO
SELECT DATEPART(week, '2025-12-31');   -- 53

-- ISO week: use isowk or iso_week
SELECT DATEPART(isowk, '2025-12-31');  -- 1
SELECT DATEPART(iso_week, '2025-12-31');  -- 1 (same)

SQL Server‑ன் default DATEPART(week, ...) US‑style. ISO version isowk. ஐரோப்பிய அமைப்புகளோடு ஒப்பிடும் report‑களை உருவாக்குகிறீர்கள் என்றால், எப்போதும் isowk பயன்படுத்துங்கள்.

SQLite — native week function இல்லை

SQLite‑ல் WEEKNUM அல்லது EXTRACT(week ...) இல்லை. strftime பயன்படுத்த வேண்டும்:

-- '%W' is Monday-start, US-style
SELECT strftime('%W', '2025-12-31');   -- 52

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

ISO workaround அந்த வாரத்தின் வியாழனை கண்டுபிடித்து அங்கிருந்து எண்ணுகிறது. இது சரியானது; ஆனால் வெளிப்படையாகத் தெரியாது.

ஒரு Cheat Sheet

கருவிISO வாரம்US வாரம்குறிப்புகள்
ExcelISOWEEKNUM() அல்லது WEEKNUM(d, 21)WEEKNUM() defaultISOWEEKNUM 2013‑ல் சேர்க்கப்பட்டது
Google SheetsISOWEEKNUM()WEEKNUM() defaultExcel போலவே
Pythondate.isocalendar()[1] அல்லது %V%W (Mon) / %U (Sun)ISO week year‑க்கு %G பயன்படுத்தவும்
JavaScriptManual அல்லது date-fns getISOWeek()ManualNative week number இல்லை
PostgreSQLEXTRACT(week ...)built-in இல்லைDefault ISO
MySQLWEEK(d, 3)WEEK(d) அல்லது WEEK(d, 0)Mode 3 = ISO
SQL ServerDATEPART(isowk, d)DATEPART(week, d)Default US
SQLiteworkaround தேவைstrftime('%W', d)Native support இல்லை

நடைமுறையில் mismatch‑களைத் தவிர்ப்பது எப்படி

ஒரு முறையைத் தேர்வு செய்து எல்லா இடத்திலும் அதையே enforce செய்யுங்கள். புதிய அமைப்புகளுக்கு ISO பொதுவாக சிறந்த default — அது சர்வதேசமாக standardised; மேலும் பல modern libraries அதை தான் implement செய்கின்றன.

ISO week year‑ஐ, week number‑உடன் சேர்த்து சேமிக்கவும். 2026‑இன் Week 1 மற்றும் 2025‑இன் Week 1 ஒன்றல்ல. ஆண்டு இல்லாமல் 1 மட்டும் சேமித்தால் அது ambiguity.

ஆண்டு எல்லை (year-boundary) கேஸ்களை தெளிவாகச் சோதிக்கவும். டிசம்பர் 28–31 மற்றும் ஜனவரி 1–3 பகுதிகளில் தான் mismatch ஏற்படும். Deploy செய்வதற்கு முன் இந்த தேதிகளுடன் உங்கள் pipeline‑ஐ test செய்யுங்கள்.

சந்தேகம் இருந்தால், முழு தேதிகளையே சேமித்து ஒப்பிடுங்கள். week number என்பது display/reporting‑க்கு; primary key அல்லது join‑க்கு அல்ல. பல அமைப்புகளுக்கு இடையில் week number கொண்டு join செய்கிறீர்கள் என்றால், முதலில் canonical date‑க்கு (அந்த வாரத்தின் Monday) மாற்றுங்கள்.

ISO Week Number Calculator கொண்டு எந்த தேதிக்கும் சரியான ISO வார எண்ணை சரிபார்க்கலாம்; முழு ஆண்டு calendar view‑உடன் கூட.