Excel, SQL, Python और JavaScript एक ही तारीख के लिए अलग-अलग सप्ताह संख्या क्यों देते हैं

आप Python में एक सप्ताह संख्या की गणना करते हैं, फिर उसी तारीख को Excel में खोलते हैं, और संख्याएँ मेल नहीं खातीं। आप एक SQL क्वेरी चलाते हैं और तीसरा परिणाम मिलता है। आप ऑनलाइन खोजते हैं और चौथा मिलता है।

यह कोई बग नहीं है। यह एक डिज़ाइन विकल्प है जिसे हर टूल अलग तरीके से बनाता है — और अधिकांश इसे पर्याप्त रूप से प्रमुखता से दस्तावेज़ीकृत नहीं करते।

सामान्य उपयोग में कम से कम दो प्रमुख सप्ताह संख्या प्रणालियाँ हैं, प्रत्येक के भीतर कई भिन्नताएँ हैं, और कोई सार्वभौमिक डिफ़ॉल्ट नहीं है। एक बार जब आप अंतर समझ लेते हैं, तो बेमेल को डीबग करने में सेकंड लगते हैं। तब तक, ये पागल कर देने वाले होते हैं।

दो मुख्य प्रणालियाँ

ISO 8601 (अधिकांश यूरोप, अंतर्राष्ट्रीय व्यापार और वैज्ञानिक संदर्भों में उपयोग की जाती है)

  • सप्ताह सोमवार से रविवार तक चलते हैं
  • सप्ताह 1 वह सप्ताह है जिसमें वर्ष का पहला गुरुवार आता है
  • एक वर्ष में 52 या 53 सप्ताह होते हैं
  • सीमाओं पर सप्ताह वर्ष कैलेंडर वर्ष से भिन्न हो सकता है

US / सरल प्रणाली (उत्तरी अमेरिका और कई स्प्रेडशीट डिफ़ॉल्ट में उपयोग की जाती है)

  • सप्ताह रविवार से शनिवार तक चलते हैं (या कभी-कभी सोमवार से रविवार तक, लोकेल पर निर्भर करते हुए)
  • सप्ताह 1 वह सप्ताह है जिसमें 1 जनवरी आती है
  • 1 जनवरी हमेशा सप्ताह 1 में होती है, चाहे वह किसी भी दिन पड़े
  • वर्ष के अंत में आंशिक सप्ताहों को उच्च संख्याएँ मिलती हैं (52 या 53), अगले वर्ष में नहीं भेजी जातीं

व्यावहारिक अंतर दिसंबर के अंत और जनवरी की शुरुआत में सबसे स्पष्ट रूप से दिखता है।

तारीखISO सप्ताहUS सप्ताह (रवि शुरुआत)
28 दिसंबर 2025सप्ताह 52, 2025सप्ताह 53, 2025
29 दिसंबर 2025सप्ताह 1, 2026सप्ताह 53, 2025
30 दिसंबर 2025सप्ताह 1, 2026सप्ताह 53, 2025
31 दिसंबर 2025सप्ताह 1, 2026सप्ताह 53, 2025
1 जनवरी 2026सप्ताह 1, 2026सप्ताह 1, 2026
2 जनवरी 2026सप्ताह 1, 2026सप्ताह 1, 2026
3 जनवरी 2026सप्ताह 1, 2026सप्ताह 1, 2026
4 जनवरी 2026सप्ताह 1, 2026सप्ताह 2, 2026

29-31 दिसंबर 2025 ISO सप्ताह 1 of 2026 में पड़ते हैं — क्योंकि उस सप्ताह का गुरुवार (1 जनवरी) 2026 में है। US प्रणाली उन्हें 2025 के सप्ताह 53 में रखती है।

Excel: WEEKNUM बनाम ISOWEEKNUM

Excel में दो अलग-अलग फ़ंक्शन हैं, जो अधिकांश टूल्स से अधिक स्पष्ट है।

WEEKNUM(date, [return_type]) — US-स्टाइल, कॉन्फ़िगर करने योग्य सप्ताह शुरुआत के साथ

return_type तर्क नियंत्रित करता है कि कौन सा दिन सप्ताह शुरू करता है:

return_typeसप्ताह शुरू होता है
1 (डिफ़ॉल्ट)रविवार
2सोमवार
11सोमवार
12मंगलवार
13बुधवार
14गुरुवार
15शुक्रवार
16शनिवार
17रविवार
21सोमवार (ISO 8601)

return_type = 21 WEEKNUM को ISO की तरह व्यवहार करवाता है — लेकिन यह खराब तरीके से दस्तावेज़ीकृत है और अधिकांश उपयोगकर्ता नहीं जानते कि यह मौजूद है।

ISOWEEKNUM(date) — ISO 8601, हमेशा सोमवार शुरुआत, गुरुवार नियम

यह Excel 2013 में जोड़ा गया था। यह सही ISO सप्ताह संख्या लौटाता है और अस्पष्ट नहीं है।

=ISOWEEKNUM("2025-12-31")   → 1    (2026 का सप्ताह 1)
=WEEKNUM("2025-12-31", 1)   → 53   (2025 का सप्ताह 53, रविवार शुरुआत)
=WEEKNUM("2025-12-31", 2)   → 53   (2025 का सप्ताह 53, सोमवार शुरुआत)
=WEEKNUM("2025-12-31", 21)  → 1    (ISO-संगत, ISOWEEKNUM के समान)

सामान्य गलती: ISO-आधारित सिस्टम से तुलना करते समय डिफ़ॉल्ट तर्कों के साथ WEEKNUM का उपयोग करना। संख्याएँ अधिकांश तारीखों के लिए मेल खाएंगी लेकिन वर्ष के अंत के पास चुपचाप अलग हो जाएंगी।

Google Sheets: समान फ़ंक्शन, समान चेतावनियाँ

Google Sheets में Excel के समान व्यवहार के साथ WEEKNUM और ISOWEEKNUM दोनों हैं। डिफ़ॉल्ट WEEKNUM US-स्टाइल, रविवार शुरुआत है। ISOWEEKNUM ISO 8601 है।

एक अंतर: ISOWEEKNUM के साथ YEAR का उपयोग करने पर Google Sheets ISO सप्ताह वर्ष लौटाने में अधिक सुसंगत है। यदि आप =YEAR("2025-12-31") लिखते हैं तो आपको 2025 मिलता है, लेकिन ISO सप्ताह 2026 से संबंधित है। कोई एकल अंतर्निहित फ़ंक्शन नहीं है जो ISO सप्ताह वर्ष लौटाए — आपको इसे गणना करनी होगी:

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

यह verbose है। यदि आप Sheets में गंभीर सप्ताह-वर्ष कार्य कर रहे हैं, तो अक्सर Python या SQL में निर्यात करना अधिक स्पष्ट होता है।

Python: isocalendar() ISO है, लेकिन strftime('%W') नहीं है

Python का datetime मॉड्यूल आपको दो अलग-अलग तरीके देता है।

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)

ध्यान दें कि लौटाया गया वर्ष ISO सप्ताह वर्ष (2026) है, न कि कैलेंडर वर्ष (2025)। यह सही और महत्वपूर्ण है — यदि आपको सप्ताह को लेबल करना है, तो d.year नहीं बल्कि iso_year का उपयोग करें।

strftime('%W') और strftime('%U') — US-स्टाइल, अलग-अलग सप्ताह शुरुआत

d.strftime('%W')   # सप्ताह संख्या, सोमवार पहले दिन के रूप में → '52'
d.strftime('%U')   # सप्ताह संख्या, रविवार पहले दिन के रूप में → '52'
d.strftime('%V')   # ISO सप्ताह संख्या → '01'
d.strftime('%G')   # ISO सप्ताह वर्ष → '2026'

%V / %G संयोजन ISO-सही है। %W / %U निर्देश US-स्टाइल हैं और वर्ष सीमाओं पर ISO से असहमत होंगे।

सामान्य गलती: जब आपके अन्य सिस्टम ISO का उपयोग करते हैं तो सप्ताह संख्याएँ प्राप्त करने के लिए d.strftime('%W') का उपयोग करना। वे वर्ष के 48+ सप्ताहों के लिए सहमत होंगे, फिर दिसंबर और जनवरी में चुपचाप अलग हो जाएंगे।

# ISO तुलना के लिए गलत — वर्ष सीमा पर बेमेल होगा
week = int(d.strftime('%W'))

# ISO के लिए सही
iso_year, iso_week, _ = d.isocalendar()

JavaScript: कोई अंतर्निहित नहीं, खुद बनाएं

JavaScript के Date ऑब्जेक्ट में कोई नेटिव सप्ताह संख्या विधि नहीं है। Date.getDay() 0 (रविवार) से 6 (शनिवार) लौटाता है। आपको इसे मैन्युअल रूप से गणना करनी होगी या date-fns या dayjs जैसी लाइब्रेरी का उपयोग करना होगा।

मैन्युअल ISO सप्ताह गणना:

function isoWeek(date) {
  const d = new Date(date)
  d.setHours(0, 0, 0, 0)
  // वर्तमान सप्ताह में गुरुवार वर्ष तय करता है
  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) गणना लिखना और इसे सप्ताह संख्या कहना। यह न ISO देता है और न ही US-मानक परिणाम — यह एक पूरी तरह से अलग (और गलत) प्रणाली है।

SQL: यह डेटाबेस पर निर्भर करता है

हर प्रमुख डेटाबेस सप्ताह संख्याओं को अलग तरह से संभालता है।

PostgreSQL — डिफ़ॉल्ट रूप से ISO

SELECT EXTRACT(week FROM DATE '2025-12-31');
-- 1 लौटाता है (ISO सप्ताह)

SELECT DATE_PART('week', DATE '2025-12-31');
-- 1 लौटाता है (समान, ISO)

-- ISO सप्ताह वर्ष प्राप्त करें
SELECT EXTRACT(isoyear FROM DATE '2025-12-31');
-- 2026 लौटाता है

PostgreSQL का EXTRACT(week ...) ISO 8601 का पालन करता है। सप्ताह वर्ष isoyear के माध्यम से उपलब्ध है।

MySQL / MariaDB — कई मोड

-- मोड 3 ISO 8601 है (सोमवार शुरुआत, सप्ताह 1 में गुरुवार है)
SELECT WEEK('2025-12-31', 3);   -- 1

-- मोड 0 (डिफ़ॉल्ट) US-स्टाइल है, रविवार शुरुआत
SELECT WEEK('2025-12-31', 0);   -- 53
SELECT WEEK('2025-12-31');      -- 53 (डिफ़ॉल्ट मोड 0)

-- YEARWEEK संयुक्त year+week लौटाता है
SELECT YEARWEEK('2025-12-31', 3);  -- 202601

MySQL में मोड तर्क महत्वपूर्ण है और इसके 8 विकल्प हैं (0–7)। मोड 3 ISO है। डिफ़ॉल्ट (मोड 0) US-स्टाइल है। यह डेटाबेस बैकएंड स्विच करते समय बग का एक सामान्य स्रोत है।

SQL Server — डिफ़ॉल्ट रूप से ISO नहीं

-- डिफ़ॉल्ट DATEPART(week, ...) ISO नहीं है
SELECT DATEPART(week, '2025-12-31');   -- 53

-- ISO सप्ताह: isowk या iso_week का उपयोग करें
SELECT DATEPART(isowk, '2025-12-31');  -- 1
SELECT DATEPART(iso_week, '2025-12-31');  -- 1 (समान)

SQL Server का डिफ़ॉल्ट DATEPART(week, ...) US-स्टाइल का उपयोग करता है। isowk उपनाम ISO संस्करण है। यदि आप यूरोपीय सिस्टम से तुलना करने वाली रिपोर्ट बना रहे हैं, तो हमेशा isowk का उपयोग करें।

SQLite — कोई नेटिव सप्ताह फ़ंक्शन नहीं

SQLite में WEEKNUM या EXTRACT(week ...) नहीं है। आप strftime का उपयोग करते हैं:

-- '%W' सोमवार-शुरुआत, US-स्टाइल है
SELECT strftime('%W', '2025-12-31');   -- 52

-- ISO सप्ताह के लिए वर्कअराउंड की आवश्यकता है
SELECT (strftime('%j', date('2025-12-31', '-3 days', 'weekday 4')) - 1) / 7 + 1;
-- 1

ISO वर्कअराउंड सप्ताह के गुरुवार को खोजता है और वहाँ से गिनता है। यह सही है लेकिन स्पष्ट नहीं है।

एक चीट शीट

टूलISO सप्ताहUS सप्ताहनोट्स
ExcelISOWEEKNUM() या WEEKNUM(d, 21)WEEKNUM() डिफ़ॉल्टISOWEEKNUM 2013 में जोड़ा गया
Google SheetsISOWEEKNUM()WEEKNUM() डिफ़ॉल्टExcel के समान
Pythondate.isocalendar()[1] या %V%W (सोम) / %U (रवि)ISO सप्ताह वर्ष के लिए %G का उपयोग करें
JavaScriptमैन्युअल या date-fns getISOWeek()मैन्युअलकोई नेटिव सप्ताह संख्या नहीं
PostgreSQLEXTRACT(week ...)अंतर्निहित नहींडिफ़ॉल्ट रूप से ISO
MySQLWEEK(d, 3)WEEK(d) या WEEK(d, 0)मोड 3 = ISO
SQL ServerDATEPART(isowk, d)DATEPART(week, d)डिफ़ॉल्ट US है
SQLiteवर्कअराउंड आवश्यकstrftime('%W', d)कोई नेटिव समर्थन नहीं

व्यवहार में बेमेल से कैसे बचें

एक प्रणाली चुनें और इसे हर जगह लागू करें। ISO अधिकांश नए सिस्टम के लिए बेहतर डिफ़ॉल्ट है — यह अंतर्राष्ट्रीय रूप से मानकीकृत है और अधिकांश आधुनिक लाइब्रेरी इसे लागू करती हैं।

हमेशा सप्ताह संख्या के साथ ISO सप्ताह वर्ष संग्रहीत करें। सप्ताह 1, 2026 और सप्ताह 1, 2025 अलग-अलग सप्ताह हैं। केवल 1 संग्रहीत करने वाला कॉलम वर्ष के बिना अस्पष्ट है।

अपने वर्ष-सीमा के मामलों को स्पष्ट रूप से जांचें। 28-31 दिसंबर और 1-3 जनवरी की तारीखें वे हैं जहाँ बेमेल होती है। तैनाती से पहले इस सीमा में परीक्षण तारीखों के साथ अपनी पाइपलाइन चलाएं।

संदेह होने पर, पूर्ण तारीखें संग्रहीत और तुलना करें। सप्ताह संख्याएँ प्रदर्शन और रिपोर्टिंग के लिए हैं, प्राथमिक कुंजियों या जॉइन के लिए नहीं। यदि आप सिस्टम के पार सप्ताह संख्या पर डेटा जॉइन कर रहे हैं, तो पहले एक canonical तारीख (सप्ताह के सोमवार) में कनवर्ट करें।

किसी भी तारीख के लिए सही ISO सप्ताह संख्या जांचने के लिए ISO सप्ताह संख्या कैलकुलेटर का उपयोग करें, जिसमें पूर्ण वर्ष कैलेंडर दृश्य शामिल है।