วิธีคำนวณ “สัปดาห์ทำงาน” ระหว่างสองวันที่ (และทำไมมันยากกว่าที่คิด)
คุณมีสองวันที่และต้องรู้ว่ามี “สัปดาห์ทำงาน” กี่สัปดาห์อยู่ระหว่างนั้น ฟังดูเหมือนปัญหา 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 แสดงทั้งวันปฏิทินและวันทำงานสำหรับช่วงวันที่เลือก — เหมาะเป็นจุดเริ่มต้นก่อนปรับด้วยวันหยุดของเขตอำนาจของคุณ