การเขียนคำสั่ง SQL นับจำนวนวันทำการโดยใช้ฐานข้อมูล Oracle

วันนี้มีแนวคิดเล็กๆ ที่ต้องการแชร์เพื่อนำไปต่อยอดสู่งานใหญ่ต่อไป โจทย์ในวันนี้ คือ การนับจำนวนวันทำการที่ไม่รวมวันเสาร์-อาทิตย์และวันหยุดนักขัตฤกษ์ ฟังก์ชันที่นำมาใช้ ได้แก่

TO_CHAR คือ ฟังก์ชันที่ทำหน้าที่แปลงข้อมูลที่อยู่ในรูปแบบของตัวเลขหรือวันที่ให้เป็นข้อมูลตัวอักษร โดยมี Syntax ดังนี้

TO_CHAR (value [, format_mask] [, nls_language])

พารามิเตอร์ที่เกี่ยวข้องกับฟังก์ขัน TO_CHART คือ
value คือ ข้อมูลที่อยู่ในรูปแบบตัวเลขหรือวันที่ที่ต้องการแปลงเป็นตัวอักษร (ค่าที่ต้องระบุ)
format_mask คือ รูปแบบที่สามารถกำหนดให้แสดงผลในการแปลงค่าตัวอักษร (ระบุเพิ่มเติมได้)
nls_language คือ nls language ที่ใช้ในการแปลงค่าเป็นตัวอักษร (ระบุเพิ่มเติมได้)

ตัวอย่างการเรียกใช้ฟังก์ชัน TO_CHAR

ROWNUM Pseudocolumn เป็นคำสั่งที่บอกลำดับของแถว (Row) ของข้อมูล โดยนับจำนวนแถวตามเงื่อนไขทั้งหมดของ SQL statement และแสดงตัวเลขที่ระบุลำดับที่ของแถว โดยแถวแรกจะมีค่าเป็น 1

ตัวอย่าง SQL statement การใช้ ROWNUM

NLS_TERRITORY คือ พารามิเตอร์ของฐานข้อมูลที่กำหนดลำดับวันที่เริ่มต้นของสัปดาห์ ยกตัวอย่าง เช่น

NLS_TERRITORYFirst Day of the Week
NLS_TERRITORY = “GERMANY”Monday = 1, Tuesday = 2, Sunday = 7
NLS_TERRITORY = “AMERICA”Sunday = 1, Monday = 2, Saturday = 7

เริ่มนับจำนวนวันทำการที่ไม่รวมวันเสาร์-อาทิตย์และวันหยุดนักขัตฤกษ์กัน
ตารางวันหยุด (HOLIDAY) มีโครงสร้าง ดังนี้

NameDatatypePKComments
HOLIDAYDATEDATEYวันหยุด
HOLIDAY_NAMEVARCHAR2(100)Nชื่อวันหยุด

จากนั้นเลือกตารางที่มีข้อมูลที่สามารถสร้างช่วงของวันที่ได้ ผู้เขียนเลือกตาราง Department ซึ่งมีจำนวนข้อมูล 502 rows

ตัวอย่างช่วงของวันที่ที่ต้องการหาจำนวนวันทำการ คือ วันจันทร์ที่ 11 เมษายน 2565 – วันจันทร์ที่ 18 เมษายน 2565
1. หาช่วงขอวันทั้งหมด โดยนำวันที่เริ่มต้น + ROWNUM -1 และตัดเฉพาะช่วงของวันที่ที่ต้องการ

2. หักวันเสาร์-อาทิตย์และวันหยุดนักขัตฤกษ์ออก จากรูปก่อนหน้าวันเสาร์-วันอาทิตย์มีค่า 7 และ 1 ตามลำดับ เป็นไปตามค่าพารามิเตอร์ที่กำหนดไว้ใน NLS_TERRITORY โดยเขียน SQL statement ได้ดังนี้

เมื่อ Run คำสั่งก็จะได้ผลลัพธ์เป็นจำนวนวันทำการทั้งหมด 3 วันดังรูปนั่นเอง เริ่มจากเรียนรู้คำสั่งและฝึกกับโจทย์บ่อยๆ ก็จะได้วิธีการที่หลากหลาย ค่อยๆ เรียนรู้ไปด้วยกันน้า

อ้างอิง

https://www.techonthenet.com/oracle/functions/to_char.php

https://docs.oracle.com/cd/B19306_01/server.102/b14225/ch3globenv.htm

ผู้เขียน