วิธีคำนวณ “สัปดาห์ทำงาน” ระหว่างสองวันที่ (และทำไมมันยากกว่าที่คิด)

คุณมีสองวันที่และต้องรู้ว่ามี “สัปดาห์ทำงาน” กี่สัปดาห์อยู่ระหว่างนั้น ฟังดูเหมือนปัญหา 5 วินาที: เอาจำนวนวันหาร 7 แล้วลบวันหยุดสุดสัปดาห์นิดหน่อย — จบ

แต่ความจริงไม่ใช่แบบนั้น เพราะคำว่า “สัปดาห์ทำงาน” ไม่ได้มีความหมายที่เป๊ะเสมอไป ขึ้นอยู่กับว่าคุณกำลังคำนวณอะไร — ระยะเวลาแจ้งลา (notice period), ไทม์ไลน์โปรเจกต์, สิทธิ์การลา, ระยะเวลาสัญญา — วิธีที่ถูกต้องจะแตกต่างกัน และถ้าใช้วิธีผิดอาจคลาดเคลื่อนเป็น “วัน” ได้ ซึ่งในบางกรณีมีผลทางกฎหมายหรือการเงิน

“สัปดาห์ทำงาน” คืออะไรกันแน่?

โดยทั่วไป “สัปดาห์ทำงาน” มักหมายถึง 5 วัน: วันจันทร์ถึงวันศุกร์ แต่มีเคสขอบเขต (edge cases) ที่ควรรู้:

  • บางอุตสาหกรรม/บางประเทศใช้สัปดาห์ทำงาน 6 วัน (จันทร์–เสาร์)
  • บางตำแหน่งงานใช้สัปดาห์ทำงานแบบอัดแน่น 4 วัน
  • ตะวันออกกลางโดยดั้งเดิมใช้ อาทิตย์–พฤหัสฯ แม้ว่าหลายประเทศจะย้ายไป จันทร์–ศุกร์แล้ว
  • พนักงานพาร์ตไทม์อาจมีสัปดาห์ทำงานแค่ 2, 3 หรือ 4 วัน

ในบทความนี้ “สัปดาห์ทำงาน” หมายถึงสัปดาห์มาตรฐาน จันทร์–ศุกร์ เว้นแต่จะระบุเป็นอย่างอื่น วิธีการต่าง ๆ จะปรับใช้ได้เมื่อคุณรู้ว่า “วันทำงาน” ที่ถูกต้องสำหรับสถานการณ์ของคุณคือวันใดบ้าง

วิธีที่ 1: นับเป็น “สัปดาห์ทำงานเต็มสัปดาห์”

การตีความที่ง่ายที่สุด: ระหว่างสองวันที่มีบล็อก จันทร์–ศุกร์ แบบ “ครบชุด” กี่บล็อก?

นี่คือสิ่งที่คนส่วนใหญ่หมายถึงเมื่อถามว่า “ต้องแจ้งล่วงหน้ากี่สัปดาห์?” ระยะเวลาแจ้งลา 4 สัปดาห์หมายถึง 4 บล็อก จันทร์–ศุกร์ เต็ม ๆ — 20 วันทำงาน — ไม่ว่าคุณจะเริ่มต้นตรงกลางสัปดาห์หรือไม่

แนวคิดการคำนวณ:

1. นับจำนวนวันปฏิทินทั้งหมดระหว่างสองวัน 2. ลบวันหยุดสุดสัปดาห์ออก: ทุก ๆ 7 วันเต็มมีวันหยุดสุดสัปดาห์ 2 วัน 3. จัดการสัปดาห์ที่ไม่เต็มที่ช่วงต้นและช่วงท้าย

ในทางปฏิบัติ มักง่ายกว่าที่จะนับ “วันทำงาน” โดยตรง แล้วหารด้วย 5:

working_weeks = working_days / 5

โดยที่ working_days คือจำนวนวัน จันทร์–ศุกร์ ระหว่างสองวัน

ตัวอย่าง: 7 เมษายน (จันทร์) ถึง 2 พฤษภาคม (ศุกร์)

  • วันปฏิทิน: 25
  • วันหยุดสุดสัปดาห์ในช่วงนั้น: เสาร์ 4 วัน + อาทิตย์ 4 วัน = 8 วัน
  • วันทำงาน: 25 − 8 = 17... เดี๋ยว นี่ไม่ถูก

วิธีที่ถูกต้องคือ “นับวันจันทร์ถึงศุกร์” เป็นบล็อก:

  • สัปดาห์ที่ 1: 7–11 เม.ย. (5 วัน)
  • สัปดาห์ที่ 2: 14–18 เม.ย. (5 วัน)
  • สัปดาห์ที่ 3: 21–25 เม.ย. (5 วัน)
  • สัปดาห์ที่ 4: 28 เม.ย.–2 พ.ค. (5 วัน)

รวม: 20 วันทำงาน = 4 สัปดาห์ทำงานพอดี

เพราะตัวอย่างเริ่มวันจันทร์และจบวันศุกร์จึงออกมาสวย ๆ ถ้าเริ่มหรือจบกลางสัปดาห์มักได้ผลลัพธ์เป็นเศษส่วน ซึ่งพาเราไปสู่วิธีถัดไป

วิธีที่ 2: นับวันทำงานแล้ว “หารด้วย 5”

สำหรับงานจริงส่วนใหญ่ — วางแผนโปรเจกต์, ประมาณไทม์ไลน์, คำนวณความสามารถในการทำงาน (capacity) — คุณไม่ได้ต้องการ “สัปดาห์เต็ม” คุณต้องการ “วันทำงาน” แล้วค่อยแสดงผลเป็น “กี่สัปดาห์กี่วัน”

สูตร:

total_working_days = (full_weeks × 5) + working_days_in_partial_week
weeks = floor(total_working_days / 5)
remaining_days = total_working_days mod 5

ตัวอย่าง: 18 มีนาคม (พุธ) ถึง 11 เมษายน (ศุกร์)

นับวันทำงาน:

  • 18 มี.ค. (พุธ) ถึง 21 มี.ค. (ศุกร์): 4 วัน
  • 24–28 มี.ค.: 5 วัน
  • 31 มี.ค.–4 เม.ย.: 5 วัน
  • 7–11 เม.ย.: 5 วัน

รวม: 19 วันทำงาน = 3 สัปดาห์ 4 วัน

วิธีนี้เหมาะกับไทม์ไลน์โปรเจกต์ที่คิดเป็น “กำลังงานเป็นวัน” ไม่ใช่สัปดาห์ปฏิทิน

วิธีที่ 3: ช่วงสัปดาห์แบบ ISO (ISO Week Span)

บางครั้งคำว่า “กี่สัปดาห์ระหว่างกัน” หมายถึง: ต่างกันกี่สัปดาห์ในเลขสัปดาห์แบบ ISO?

ตัวอย่าง: อีเวนต์เริ่ม ISO Week 10 ถึง ISO Week 23 เท่ากับระยะ 13 สัปดาห์แบบ ISO

การคำนวณ:

week_span = (end_iso_year × 52.18) + end_iso_week − (start_iso_year × 52.18) + start_iso_week

ในทางปฏิบัติ ถ้าอยู่ในปีเดียวกัน:

week_span = end_iso_week − start_iso_week

ถ้าข้ามปี ต้องคำนึงว่าปีเริ่มต้นมี 52 หรือ 53 สัปดาห์:

week_span = (52_or_53_for_start_year − start_iso_week) + end_iso_week

วิธีนี้เกี่ยวข้องกับตารางออกอากาศ การวางแผนค้าปลีก และระบบที่จัดงานตามเลขสัปดาห์ ISO มากกว่าจำนวนวันทำงาน

ปัญหา “นับรวมวันไหนบ้าง” (Inclusivity)

แหล่งที่มาของความผิดพลาดที่พบบ่อยที่สุดอย่างหนึ่ง: ควรนับวันเริ่มต้น วันสิ้นสุด ทั้งสองวัน หรือไม่ต้องนับทั้งคู่?

“แจ้งลา 4 สัปดาห์เริ่มวันนี้” อาจแปลได้ว่า:

  • 4 สัปดาห์นับจากวันนี้ โดยถือว่าวันนี้คือวันแรก (เริ่มแบบ inclusive): จบในวันเดียวกันของสัปดาห์อีก 4 สัปดาห์ถัดไป
  • 4 สัปดาห์หลังจากวันนี้ (เริ่มแบบ exclusive): จบช้ากว่าแบบบน 1 วัน

กฎหมายแรงงานในหลายประเทศระบุเรื่องนี้ไว้ชัดเจน เช่น กฎหมายแรงงานสหราชอาณาจักรนับระยะเวลาแจ้งลาตั้งแต่ “วันถัดจากวันที่แจ้ง” ส่วนในสหรัฐฯ ขึ้นกับสัญญา

ความต่างคือ 1 วัน ซึ่งหลายกรณีอาจไม่สำคัญ แต่ในข้อพิพาทแรงงานหรือการยกเลิกสัญญาอาจสำคัญมาก

แนวทางปลอดภัย: ระบุให้ชัดเสมอว่า “X สัปดาห์ทำงานนับจาก [วันที่] แบบ inclusive/exclusive” อย่าปล่อยให้กำกวม

วันหยุดนักขัตฤกษ์: สิ่งที่ทุกคนลืม

การคำนวณสัปดาห์ทำงานที่ไม่หักวันหยุดนักขัตฤกษ์ (public holidays) โดยนิยามแล้ว “ผิด” เพราะจะนับเวลาทำงานเกินจริง

ความยากคือวันหยุดไม่เป็นมาตรฐานเดียวกัน มันต่างกันตาม:

  • ประเทศ (คริสต์มาสเป็นวันหยุดในสหราชอาณาจักร แต่ไม่ใช่วันหยุดราชการในญี่ปุ่น)
  • ภูมิภาคในประเทศเดียวกัน (รัฐต่าง ๆ ในสหรัฐฯ มีวันหยุดต่างกัน; อังกฤษกับสกอตแลนด์มี bank holiday ต่างกัน)
  • ปี (วันหยุดที่เลื่อนได้ เช่น อีสเตอร์ เปลี่ยนวันทุกปี)
  • สัญญาจ้างงาน (บางงานมีวันหยุดเพิ่ม; บางภาครัฐใช้วันสังเกตต่างกัน)

สำหรับการประมาณคร่าว ๆ เช่น “ประมาณ 6 สัปดาห์ทำงาน” จะไม่หักวันหยุดก็พอได้ แต่สำหรับงานที่ต้องเป๊ะ เช่น เดดไลน์ตามสัญญา ระยะเวลาแจ้งลา กรอบเวลาทางกฎหมาย — คุณต้องหักวันหยุดที่เกี่ยวข้องออก

ไม่มีเครื่องคิดเลขใดทำให้คุณได้อัตโนมัติ หากไม่รู้เขตอำนาจ (jurisdiction) และปีที่เจาะจง เครื่องคิดเลข days between dates ให้จำนวนวันทำงานที่ตัดวันหยุดสุดสัปดาห์แล้ว จากนั้นคุณต้องหักวันหยุดท้องถิ่นเอง

ตัวประมาณที่มีประโยชน์สำหรับสหราชอาณาจักร: มี bank holidays ราว 8 วันต่อปี หรือประมาณ 1.6 วันต่อเดือน ดังนั้นช่วง 3 เดือนก็ประมาณ 5 วันให้หัก สำหรับวันหยุดรัฐบาลกลางสหรัฐฯ: 11 วันต่อปี หรือประมาณ 0.9 วันต่อเดือน

ระยะเวลาแจ้งลา: คณิตศาสตร์จริง ๆ ทำงานอย่างไร

สัญญาจ้างงานมักระบุ notice period เป็น “สัปดาห์” หรือ “เดือน” การแปลงสิ่งนี้เป็นวันทำงานคือจุดที่ผิดพลาดบ่อยที่สุด

“แจ้งลา 4 สัปดาห์” หมายถึง 4 สัปดาห์ปฏิทิน (28 วัน) ไม่ใช่ 4 × 5 = 20 วันทำงาน ถ้าแจ้งในวันอังคาร ก็จะนับไป 28 วันปฏิทิน (รวมสุดสัปดาห์) และวันสุดท้ายจะเป็นวันอังคารอีก 4 สัปดาห์ถัดไป

หลายคนแปลกใจ เพราะคาดว่า “4 สัปดาห์” จะเท่ากับ 20 วันทำงาน แต่มันไม่ใช่ — มันคือ 28 วันปฏิทิน และวันหยุดสุดสัปดาห์ในช่วงนั้นยังนับเป็นส่วนหนึ่งของ notice period แม้คุณจะไม่ได้ทำงานในวันเหล่านั้น

“แจ้งลา 1 เดือน” ยิ่งไม่เป๊ะ เดือนนึงจาก 15 มกราคมคือ 15 กุมภาพันธ์ แต่เดือนนึงจาก 31 มกราคมคือ 28 กุมภาพันธ์ (หรือ 29 ในปีอธิกสุรทิน) จำนวนวันปฏิทินใน “หนึ่งเดือน” จึงผันผวน 28–31 วัน และจำนวนวันทำงานในช่วงนั้นอาจอยู่ราว 20–23 วัน

สัปดาห์ทำงาน vs สัปดาห์ปฏิทินในสัญญา:

ถ้าสัญญาเขียนว่า “แจ้งลา 4 สัปดาห์ทำงาน” นั่นหมายถึง 20 วันทำงาน (จันทร์–ศุกร์เท่านั้น) ไม่รวมสุดสัปดาห์ ในกรณีนั้น ถ้าเริ่มวันอังคาร ระยะจะกินเวลาหลายสัปดาห์ปฏิทิน ขึ้นกับจำนวนสุดสัปดาห์ที่ตกอยู่ในช่วงนั้น

ตรวจเสมอว่าสัญญาเขียนว่า “weeks” หรือ “working weeks” ความต่างอาจมากถึง 8–10 วันสำหรับ notice period ทั่วไป

ไทม์ไลน์โปรเจกต์: “สัปดาห์ของงาน” vs “สัปดาห์ปฏิทิน”

ในการบริหารโปรเจกต์ “งาน 3 สัปดาห์” กับ “3 สัปดาห์ปฏิทิน” ไม่ใช่สิ่งเดียวกัน

งาน 3 สัปดาห์ (effort) ที่กำลังเต็ม = 15 คน-วันทำงาน (person-working-days) ถ้างานหนึ่งใช้แรง 3 สัปดาห์สำหรับคนเดียวเต็มเวลา จะใช้ 3 สัปดาห์ปฏิทิน ถ้ามีสองคนช่วยกัน จะใช้ 1.5 สัปดาห์ปฏิทิน ถ้าคนเดียวทำได้แค่ 50% จะใช้ 6 สัปดาห์ปฏิทิน

3 สัปดาห์ปฏิทิน = 15 วันทำงาน (สมมติไม่มีวันหยุด ไม่มีพาร์ตไทม์ และไม่มี overhead จากการสลับงาน)

ความต่างนี้สำคัญตอนสื่อสารวันส่งมอบ หากคุณบอกผู้มีส่วนได้ส่วนเสียว่า “ใช้เวลา 3 สัปดาห์” แต่ในหัวหมายถึง 3 สัปดาห์ทำงานที่ capacity 80% และมีวันหยุดอยู่ตรงกลาง วันสิ้นสุดแบบปฏิทินจะต่างจากที่เขาจินตนาการ

เวลาตีไทม์ไลน์:

  • งานที่สั้นกว่า 1 เดือน ระบุเป็น “วันทำงาน” แทน “สัปดาห์”
  • ระบุวันสิ้นสุดแบบปฏิทินเป็น sanity check
  • ระบุวันหยุดที่อยู่ในช่วงอย่างชัดเจน

การคำนวณสัปดาห์ทำงานด้วยโค้ด

Python:

from datetime import date, timedelta

def working_days(start: date, end: date) -> int:
    total = 0
    current = start
    while current <= end:
        if current.weekday() < 5:  # 0=Mon, 4=Fri
            total += 1
        current += timedelta(days=1)
    return total

def working_weeks(start: date, end: date) -> float:
    return working_days(start, end) / 5

# Example
start = date(2026, 4, 7)
end = date(2026, 5, 2)
print(working_days(start, end))   # 20
print(working_weeks(start, end))  # 4.0

สำหรับช่วงวันที่ยาว ๆ วิธีที่เร็วกว่าใช้ modular arithmetic เพื่อลดการวนลูป:

def working_days_fast(start: date, end: date) -> int:
    days = (end - start).days + 1
    full_weeks, remainder = divmod(days, 7)
    working = full_weeks * 5
    # Count working days in the partial week
    start_dow = start.weekday()  # 0=Mon
    for i in range(remainder):
        if (start_dow + i) % 7 < 5:
            working += 1
    return working

JavaScript:

function workingDays(start, end) {
  let count = 0
  const current = new Date(start)
  while (current <= end) {
    const day = current.getDay()
    if (day !== 0 && day !== 6) count++  // 0=Sun, 6=Sat
    current.setDate(current.getDate() + 1)
  }
  return count
}

function workingWeeks(start, end) {
  return workingDays(start, end) / 5
}

SQL (PostgreSQL):

-- Working days between two dates (excluding weekends)
SELECT
  (EXTRACT(DOW FROM end_date) - EXTRACT(DOW FROM start_date))::int +
  ((end_date - start_date) / 7) * 5 +
  CASE WHEN EXTRACT(DOW FROM start_date) = 0 THEN 1 ELSE 0 END +
  CASE WHEN EXTRACT(DOW FROM end_date) = 6 THEN -1 ELSE 0 END
AS working_days
FROM (SELECT DATE '2026-04-07' AS start_date, DATE '2026-05-02' AS end_date) t;

สรุปแบบเร็ว

สิ่งที่คุณต้องการวิธีที่เหมาะ
ระยะเวลาแจ้งลาวันปฏิทิน (นับสุดสัปดาห์ด้วย)
กำลังทำงานของโปรเจกต์วันทำงาน (จันทร์–ศุกร์) แล้วหาร 5 เพื่อเป็นสัปดาห์
ตารางตามเลขสัปดาห์ISO week span
สิทธิ์การลาวันทำงาน แล้วหักวันหยุดนักขัตฤกษ์
เดดไลน์ตามสัญญาวันปฏิทิน เว้นแต่สัญญาจะระบุ “working days”

เครื่องคิดเลข days between dates แสดงทั้งวันปฏิทินและวันทำงานสำหรับช่วงวันที่เลือก — เหมาะเป็นจุดเริ่มต้นก่อนปรับด้วยวันหยุดของเขตอำนาจของคุณ