SQL Tip แจกวันหยุดปีพ.ศ. 2562 พร้อมโค้ด SQL หาวันหยุด
มีน้องๆ admin มือใหม่ (เพิ่งรับงาน) ขอข้อมูลตาราง holiday ปี 2562 ว่าจะเพิ่มยังไง หรือมีให้ดาวโหลดไหมครับ
ผมเลยมาบอกวิธีหาวันหยุด และใช้วิธีนำเข้า อ้า…ลองมาอ่านวิธีดูละกันนะครับ
คนที่ไม่รู้ว่าคืออะไร ก็บอกคร่าว ๆ ละกันนะ เป็นตาราง holiday ที่เก็บข้อมูลวันหยุด ที่ใช้สำหรับกรณีจะนัดคนไข้ ให้เช็ควันหยุดก่อน ว่าหยุดเสาร์-อาทิตย์-หรือหยุดวันนักขัตฤกษ์ หรือไม่ ประมาณนี้นะครับ พยาบาลจะได้ทราบ
ขั้นตอนแรกเลย ใช้โค้ดนี้ตรวจสอบก่อน ว่าปีพ.ศ. 2562 ในตาราง hosxp ฐานที่เราใช้ มีข้อมูลแล้วหรือยัง
*********
select day_name,count(*)as count_date,holiday_date from holiday where year(holiday_date) = ‘2019’
group by day_name
union
select “รวมทั้งสิ้น”as day_name,count(*)as count_date,”-” as holiday_date from holiday where year(holiday_date) = ‘2019’
order by count_date
**********
ถ้ามีอยู่แล้ว ตามรูป ก็น่าจะไม่ต้องทำอะไรต่อ เพราะมีข้อมูลวันหยุดแล้ว เพียงแค่ตรวจสอบว่า มีครบแล้วหรือถูกต้องแล้วหรือยัง (อันนี้ผมก็เพิ่มตามที่มีคนแจ้งเข้ามาและหาในเว็บ google )
ถ้ายังไม่มี ก็มาอ่านขั้นตอนที่ 2 นะครับ
ขั้นตอนที่ 2 หาวันหยุด (เสาร์ และ อาทิตย์)
โดยใช้ sql script ตัวนี้นะครับ *** ดาวโหลด ***
เมื่อเอารันใน HOSxP ในเมนูสายฟ้า ก็จะได้ข้อมูล 104 record
อธิบายโค้ดก่อนละกัน เดี่ยวบางคนจะงง ๆ ว่ามาได้ไง
แบ่งเป็น 2 ส่วนนะครับคือส่วนที่ดึงข้อมูลเมื่อเพื่อคำนวณ คือ
ส่วนที 1 คือ
select @start_day , @end_day,
if(@count_x < @count_day , @count_x := @count_x+1,0) as xxx,
str_to_date(date_format(date_add(@day_plus, interval @count_x day),’%d-%m-%Y’), ‘%d-%m-%Y’) as holiday_date,
if(weekday(date_add(@day_plus, interval @count_x day)) in(5,6),1,0) weekday_holiday,
part_time_date,hos_guid,hos_guid_ext,short_name
from holiday limit 365
ดึงตาราง holiday มา limit แค่ 365 record พอ แต่ไม่ได้เอาข้อมูลมาใช้ ดึงมาเป็น record จำลองเท่านั้น
แล้วสร้างตัวแปรมาคำนวณ
คือ
set @count_x = -1;
set @start_day = ‘2019-01-01′;
set @end_day = date_add(@start_day, interval 1 year);
set @count_day = datediff(@end_day, @start_day);
set @day_plus = @start_day;
ก็จะได้วันที่เริ่มต้นคือ @start_day คือวันที่ที่เราจะให้มันเริ่มคำนวณ
และวันที่สิ้นสุด @end_day คือ บวกไปอีก 1 ปี
แล้วสั่งให้ @count_x := @count_x+1 บวกไปเรื่อยๆ หากว่า @count_x ยังน้อยกว่า @count_day อยู่
แล้วหาวันที่หยุดจริงๆ ในวันที่ แต่ละ record
คือ str_to_date(date_format(date_add(@day_plus, interval @count_x day),’%d-%m-%Y’), ‘%d-%m-%Y’) as holiday_date ก็จะได้วันหยุดของแต่ละวัน
แล้วมาเช็คว่าเป็นวันหยุด จริงหรือไม่ โดยใช้ เงื่อนไขช่วย คือ
if(weekday(date_add(@day_plus, interval @count_x day)) in(5,6),1,0) weekday_holiday
หากค่าที่ได้คือ 1 คือวันหยุดเสาร์และอาทิตย์ ถ้าเป็น 0 คือไม่ใช่ ก็จะทราบได้
ส่วนที่ 2 กรองเอาเฉพาะวันหยุด เท่านั้น
คือ
set @count_x = -1;
set @start_day = ‘2019-01-01′;
set @end_day = date_add(@start_day, interval 1 year);
set @count_day = datediff(@end_day, @start_day);
set @day_plus = @start_day;
select weekday_holiday,holiday_date,if(weekday(holiday_date)=5,’วันเสาร์’,’วันอาทิตย์’) as day_name,
part_time_date,hos_guid,hos_guid_ext,short_name
from (select @start_day , @end_day,
if(@count_x < @count_day , @count_x := @count_x+1,0) as xxx,
str_to_date(date_format(date_add(@day_plus, interval @count_x day),’%d-%m-%Y’), ‘%d-%m-%Y’) as holiday_date,
if(weekday(date_add(@day_plus, interval @count_x day)) in(5,6),1,0) weekday_holiday,
part_time_date,hos_guid,hos_guid_ext,short_name
from holiday limit 365
) day_holiday
where weekday_holiday=1
เอามารวมกัน ก็จะได้เงื่อนไขคือ where weekday_holiday=1 เอาเฉพาะวันหยุดที่ เท่ากับ 1 ก็จะได้ข้อมูลครับ
พอได้ข้อมูลแล้ว จะนำเข้าไปยังตาราง holiday ยังไง อ้า….เดี่ยวมาต่อในบทความต่อไปละกันนะครับ
เริ่มยาวแล้ว
หากท่านชอบบทความนี้ กด Like กดแชร์ ด้วยนะครับ
แล้วพบกันใหม่ในบทความต่อไปครับ ขอบคุณครับ
ขอบคุณมากครับ ได้ประโยชน์มากเลยครับ