ระยะเวลารอคอย ไม่รวม LAB, Xray (07:00 - 16:00)
SELECT LEFT(o.vstdate, 7) AS ym, -- ปีและเดือนของการ Visit (YYYY-MM) COUNT(DISTINCT o.vn) AS total_visits, -- นับจำนวน Visit (VN) ที่ไม่ซ้ำกัน TIME_FORMAT( SEC_TO_TIME( AVG( TIME_TO_SEC( TIMEDIFF( CONCAT(p.rxdate, ' ', p.rxtime), -- เวลาแพทย์สั่งยา/บริการ CONCAT(o.vstdate, ' ', o.vsttime) -- เวลาลงทะเบียน ) ) ) ), '%T' ) AS avg_visit_time_hh_mm_ss, -- ค่าเฉลี่ยของระยะเวลา Visit (HH:MM:SS) CONCAT( FLOOR( TIME_FORMAT( SEC_TO_TIME( AVG( TIME_TO_SEC( TIMEDIFF( CONCAT(p.rxdate, ' ', p.rxtime), CONCAT(o.vstdate, ' ', o.vsttime) ) ) ) ), '%H' ) * 60 + TIME_FORMAT( SEC_TO_TIME( AVG( TIME_TO_SEC( TIMEDIFF( CONCAT(p.rxdate, ' ', p.rxtime), CONCAT(o.vstdate, ' ', o.vsttime) ) ) ) ), '%i' ) ), ':', TIME_FORMAT( SEC_TO_TIME( AVG( TIME_TO_SEC( TIMEDIFF( CONCAT(p.rxdate, ' ', p.rxtime), CONCAT(o.vstdate, ' ', o.vsttime) ) ) ) ), '%s' ) ) AS avg_visit_time_min_sec -- ค่าเฉลี่ยของระยะเวลา Visit ในรูปแบบ นาที:วินาทีFROM ovst oLEFT JOIN opitemrece p ON o.vn = p.vn AND p.rxdate = o.vstdateLEFT JOIN xray_head xr ON o.vn = xr.vnLEFT JOIN lab_head lb ON o.vn = lb.vnLEFT JOIN ovstoprt op ON o.vn = op.vnLEFT JOIN ipt i ON o.vn = i.vnLEFT JOIN opitemrece ekg ON o.vn = ekg.vn AND ekg.item_type = 'EKG' -- สมมติว่า EKG มี item_type เป็น 'EKG'WHERE TIMEDIFF(CONCAT(p.rxdate, ' ', p.rxtime), CONCAT(o.vstdate, ' ', o.vsttime)) < '04:00:00' AND o.vstdate BETWEEN '2025-09-01' AND '2025-09-31' AND xr.vn IS NULL AND lb.vn IS NULL AND i.vn IS NULL AND ekg.vn IS NULL AND o.vsttime BETWEEN '07:00:00' AND '16:30:00' AND o.main_dep IN ('001','057','058','066','072','073','075','076','077','095','096','100','101','102','103','104','105')GROUP BY ymORDER BY ym
ระยะเวลารอคอย รวม LAB, Xray (07:00 - 16:00)
SELECT LEFT(o.vstdate, 7) AS ym, COUNT(DISTINCT o.vn) AS total_visits, TIME_FORMAT( SEC_TO_TIME( AVG( TIME_TO_SEC( TIMEDIFF( CONCAT(p.rxdate, ' ', p.rxtime), CONCAT(o.vstdate, ' ', o.vsttime) ) ) ) ), '%T' ) AS avg_visit_time_hh_mm_ss, -- ส่วนคำนวณ นาที:วินาที ที่กระชับขึ้น CONCAT( FLOOR(AVG(TIME_TO_SEC(TIMEDIFF(CONCAT(p.rxdate, ' ', p.rxtime), CONCAT(o.vstdate, ' ', o.vsttime)))) / 60), ':', LPAD(FLOOR(AVG(TIME_TO_SEC(TIMEDIFF(CONCAT(p.rxdate, ' ', p.rxtime), CONCAT(o.vstdate, ' ', o.vsttime)))) % 60), 2, '0') ) AS avg_visit_time_min_secFROM ovst oINNER JOIN -- ใช้ INNER JOIN กับ opitemrece เพื่อให้มั่นใจว่ามีรายการสั่งการ opitemrece p ON o.vn = p.vn AND p.rxdate = o.vstdateLEFT JOIN xray_head xr ON o.vn = xr.vnLEFT JOIN lab_head lb ON o.vn = lb.vnLEFT JOIN -- ค้นหา EKG จาก opitemrece (ตรวจสอบรหัส icode ของ EKG ในระบบคุณอีกทีนะครับ) opitemrece ekg ON o.vn = ekg.vn AND ekg.icode IN ('3000159') -- แก้เป็นรหัส EKG ของโรงพยาบาลWHERE o.vstdate BETWEEN '2025-10-01' AND '2025-10-31' AND o.vsttime BETWEEN '07:00:00' AND '16:30:00' AND o.main_dep IN ('001','057','058','066','072','073','075','076','077','095','096','100','101','102','103','104','105') -- เงื่อนไขสำคัญ: ต้องมีอย่างใดอย่างหนึ่ง (ใช้ OR) AND (xr.vn IS NOT NULL OR lb.vn IS NOT NULL OR ekg.vn IS NOT NULL) -- กรองค่าผิดปกติ (เช่น ระยะเวลาติดลบ หรือนานเกินไป) AND TIMEDIFF(CONCAT(p.rxdate, ' ', p.rxtime), CONCAT(o.vstdate, ' ', o.vsttime)) BETWEEN '00:00:01' AND '04:00:00'GROUP BY ymORDER BY ym;