ขอปรึกษาในเรื่องของการตรวจสอบช่วงวันที่ในการเก็บข้อมูลแบบ 2ฟิว
ความคิดผม(ไม่แน่ใจนะครับว่าเป็นวิธีที่ดีที่สุดป่าว?)
ผมจะสร้าง 2 ตาราง
1. ตาราง tbl_leave ใช้เก็บข้อมูลของผู้ลาทั้งหมด ได้แก่ ชื่อ เบอร์โทร เมล์ วันเริ่มลา วันสิ้นสุดการลา วันเวลาที่บันทึกข้อมูล ip
2. ตาราง tbl_leave_date จะเก็บวันย่อยของรายการที่ทำลานั้นๆ โดยจะเก็บ id ของตาราง tbl_leave เพื่อเป็น FK ง่ายต่อการใช้งานต่อไป ตย.
ผมออกแบบให้ตาราง tbl_leave_date มีฟิลด์ id ,ref_leave_id(อ้างอิง),leave_date
คุณลา 17-20 ในตาราง tbl_leave_date ก็จะเก็บ
id | ref_leave_id | leave_date
1 | 1 | 2015-09-17
2 | 1 | 2015-09-18
3 | 1 | 2015-09-19
4 | 1 | 2015-09-20
****แนะนำ ให้คุณออกแบบตารางแยกตารางข้อมูลส่วนบุคคลออกไปอีกตารางนึงจะดีกว่ามาก แล้วอ้างอิง FK ของ id มาใส่ใน 2 ตารางนี้ด้วย เพื่อความถูกต้องของข้อมูลและง่ายต่อการใช้งาน
ปล. ไม่แน่ใจว่าเข้าใจที่บอกรึป่าวนะ
Date :
2015-09-17 15:59:51
By :
arm8957
แล้วคนเก่าออกแบบไว้ยังไงละครับ?
Date :
2015-09-17 16:29:16
By :
arm8957
ก็ทำเพิ่มไปอีกตารางนึงไม่ได้หรือครับ? tbl_leave_date ไง อย่างที่แนะนำไป หรือไม่ก็ใช้ datediff หาระยะเวลาของวันที่ลาเอา ยุ่งยากรึป่าวอันนี้ไม่รู้ต้องลองทำดู
Date :
2015-09-17 16:54:44
By :
arm8957
where '$วันที่เป้าหมาย' between start_la and end_la
ถ้ามี record $วันที่เป้าหมาย อยู่ในวันลา
แต่เนื่องจาก type ของวันที่เก็บ ไม่ใช่ datetime และไม่ได้เรียงลำดับความสำคัญ ไว้ซ้ายมือ Y-m-d
ดังนั้นต้องทำการแปลงรูปแบบวันที่ให้ถูกต้องก่อน
where '$วันที่เป้าหมาย' between STR_TO_DATE(start_la,'%d/%m/%Y') and STR_TO_DATE(end_la,'%d/%m/%Y')
และ $วันที่เป้าหมายก็ต้องอยู่ในรูปแบบ Y-m-d ด้วยนะครับ
ปล. ถ้าเปลี่ยน type ได้ก็เปลี่ยนซะดีกว่าครับ แต่คิดว่าคงยาก เพราะต้องไล่เปลี่ยนโค๊ดที่เกี่ยวข้องด้วย
Date :
2015-09-18 06:44:17
By :
NewbiePHP
ผมคงเข้าใจผิดในวิธีการเก็บ
ถ้า ฟีลด์ type ของ start_la และ end_la ที่เก็บอยู่ เป็น datetime
หรือ varchar แต่รูปแบบการเก็บ เป็น "2558-09-30" ( ลำดับความสำคัญ อยู่ซ้าย ปี - เดือน - วัน ) ให้ใช้แบบนี้
Code (PHP)
$date='2015-09-15';
$where = "where '$date' between start_la and end_la ";
++++++++++++++++++++++++++++++++++++++
แต่ถ้าเก็บเป็น varchar และเก็บเป็นรูปแบบ 30/09/2558 ( ลำดับความสำคัญอยู่ขวา วัน-เดือน-ปี)
ต้องแปลงข้อมูลให้ถูกต้องก่อน ให้ใช้แบบนี้
Code (PHP)
$date='2015-09-15';
$where = "where '$date' between STR_TO_DATE(start_la,'%d/%m/%Y') and STR_TO_DATE(end_la,'%d/%m/%Y')";
คำค้นอ่านเพิ่มเติม MySql STR_TO_DATE()
ปล. คำสั่ง between ของ mysql ไมได้ตรวจสอบแค่ตัวเลข ยังสามารถตรวจสอบ ตัวอักษรได้ได้
select ( 'AX' BETWEEN 'AA' AND 'ZZ') T, ( 'AX' BETWEEN 'XX' AND 'ZZ') F
ให้ลองทดสอบใน phpmyadmin ดูครับ ถ้าเป็นจริงจะได้ค่า 1 ถ้าเป็นเท็จจะได้ค่า 0
ประวัติการแก้ไข 2015-09-18 10:42:10
Date :
2015-09-18 10:36:32
By :
NewbiePHP
ตกลงแก้ปัญหายังไงครับ เผื่อท่านอื่นเค้ามีปัญหาเหมือนกัน จะได้เป็นแนวทางครับ
Date :
2015-09-18 13:42:44
By :
arm8957
Load balance : Server 00