วิธีค้นหาช่วง start_time และ end_time หากพบในช่วง ให้ตรวจสอบ start_date และ end_date

ฉันมีตารางด้านล่างในฐานข้อมูล

    id | list_id |venue_id |name | start_date | end_date   |start_time | end_time 
    1  |       1 |  1      |asdf |  2019-02-02| 2019-02-28 |05:30      |10:00
    2  |       7 |  2      |awed |  2019-02-10| 2019-02-20 |07:30      |14:00
    3  |       7 |  1      |mjgd |  2019-02-04| 2019-02-13 |09:30      |18:00

ตอนนี้ ฉันต้องค้นหา start_date และ end_date ของ venue_id=1 ระหว่างช่วง 2019-02-04 ถึง 2019-03-01 ดังนั้นฉันจึงใช้แบบสอบถามด้านล่าง

SELECT * FROM `batch_list` WHERE `venue_id` = 1 and ((start_date between '2019-02-04' and '2019-03-01') OR (end_date between '2019-02-04' and '2019-03-01'))

ตอนนี้ฉันต้องค้นหาวันที่และเวลาของ place_id=1 ซึ่งเป็นช่วง 2019-02-04 และ 2019-03-01 และ 05:00 ถึง 18:00 ดังนั้นฉันจึงลองค้นหาด้านล่าง

SELECT * FROM `batch_list` WHERE `venue_id` = 1 and ((start_date between '2019-02-04' and '2019-03-01') OR (end_date between '2019-02-04' and '2019-03-01')) and((start_time <= `end_time`) and (`start_time` between '05:00' and '18:00')and (end_time between '05:00' and '18:00'))

ดังนั้นจึงไม่มีปัญหาจนถึงขณะนี้

ฉันมีเวลาเป็น 05:00 ถึง 20:00 ฉันจะได้รับบันทึกทั้งหมดที่เกี่ยวข้องกับ place_id 1 แต่หากฉันเปลี่ยนเวลา 10:00 เป็น 13:00 ฉันจะไม่ได้รับบันทึก

ฉันต้องค้นหาว่ามี start_time และ end_time อยู่ในช่วงหรือไม่ หากพบให้ตรวจสอบ start_date และ end_date

คุณจะช่วยฉันในเรื่องนี้หรือไม่?

แบบอย่าง

function fetchBatches($venue_id,$new_batch_start_date,$new_batch_end_date,$new_batch_start_time,$new_batch_end_time)
    {
$where="batch_venue_id='$venue_id' and ((start_date between '$new_batch_start_date' and '$new_batch_end_date')OR (end_date between '$new_batch_start_date' and '$new_batch_end_date')) and ((start_time<=end_time) and (start_time < '$new_batch_start_time' and start_time < '$new_batch_end_time'))";

        $result =$this->db->select('*')    
                    ->from('batch_list')
                    ->where($where)
                    ->get()
                    ->result();
            if ($result) {
                 return $result;
            }
            else{
                 return 0;
            }

    }

person user9437856    schedule 01.02.2019    source แหล่งที่มา
comment
โอ้! ฉันคิดถึงสิ่งนั้น รอฉันกำลังอัปเดตคำถาม นั่นคือ 10.00 น. - 13.00 น. อัปเดตคำถามแล้ว   -  person user9437856    schedule 01.02.2019
comment
คุณสามารถช่วยตัวเองให้พ้นโลกแห่งความเจ็บปวดได้ด้วยการจัดเก็บวันที่และเวลาไว้เป็นรายการเดียว   -  person Strawberry    schedule 01.02.2019
comment
ฉันไม่เข้าใจ - คุณต้องการค้นหาช่วงเวลาสองช่วงที่ทับซ้อนกันจริง ๆ หรือไม่?   -  person splash58    schedule 01.02.2019
comment
@ splash58 ฉันมีบันทึกอยู่ในตารางแล้ว หากผู้ดูแลระบบต้องการสร้างระเบียน Venue_id =1 อีกครั้ง ขั้นแรกให้ตรวจสอบว่า start_time และ end_time ว่างหรือไม่อยู่ในระเบียน หากมีระเบียนว่าง จากนั้นจะตรวจสอบวันที่   -  person user9437856    schedule 01.02.2019
comment
@ splash58 เป้าหมายหลักของฉันคือผู้ดูแลระบบไม่สามารถสร้างบันทึกใด ๆ ได้หากพบช่วงเวลาและวันที่ใด ๆ ตัวอย่างเช่น: Venue_id=1 ถูกจองไว้สำหรับวันที่ 02-02-2019 ถึง 28-02-2019 และเวลาคือ 05:30 ถึง 10:30 น. หากผู้ดูแลระบบพยายามสร้างบันทึกใดๆ บนรหัสเดียวกัน ผู้ดูแลระบบจะตรวจสอบเวลาและวันที่   -  person user9437856    schedule 01.02.2019
comment
ใช่ คุณต้องการตรวจสอบว่าช่วงเวลาของคุณไม่ทับซ้อนกับช่วงเวลาใดๆ ใน db มีคำถามดังกล่าวมากมายใน SO   -  person splash58    schedule 01.02.2019
comment
อย่าแยกวันที่และเวลา - คุณควรคำถาม - place_id=1 ถูกจองไว้สำหรับวันที่ตั้งแต่ 2019-02-02 05:30 ถึง 2019-02-28 10:30   -  person splash58    schedule 01.02.2019
comment
@ splash58 ใช่ ฉันตรวจสอบ SO แล้ว แต่นั่นเป็นเพียงการตรวจสอบเวลาเท่านั้น Senario ของฉันคือถ้าพบเวลาก็ให้ตรวจสอบวันที่ด้วย   -  person user9437856    schedule 01.02.2019
comment
@ splash58 ฉันมีฟิลด์ที่ผู้ดูแลระบบสามารถป้อน start_time และ end_time   -  person user9437856    schedule 01.02.2019
comment
น่าเสียดายที่คุณไม่ได้บันทึกฟิลด์ DateTime และคุณจะต้องสร้างด้วยฟังก์ชัน mysql   -  person splash58    schedule 01.02.2019
comment
ให้เราสนทนาต่อในการแชท   -  person user9437856    schedule 01.02.2019


คำตอบ (1)


ตามที่บางคนแนะนำ ควรรวมวันที่และเวลาไว้ในฐานข้อมูลจะดีกว่า

สำหรับคำถามของคุณ ฉันคิดว่าข้อความค้นหาที่คุณต้องการคือ:

SELECT * FROM batch_list 
WHERE    venue_id = 1
         AND (start_date <= '2019-03-01') 
         AND (start_time <= '13:00:00')
         AND (end_date >= '2019-02-04')
         AND (end_time >= '10:00:00')
person Dialex    schedule 01.02.2019
comment
ขอบคุณสำหรับคำตอบ. ขอเวลาตรวจสอบหน่อยนะครับ - person user9437856; 01.02.2019
comment
อัปเดตคำตอบของฉัน ลองอีกครั้งและบอกฉันว่ามันยังใช้งานไม่ได้ - person Dialex; 05.02.2019
comment
ให้ฉันลองอีกครั้ง. - person user9437856; 05.02.2019
comment
2019-03-01 คือวันที่สิ้นสุด และ 13:00:00 คือเวลาสิ้นสุด... ถูกต้องไหม? - person user9437856; 05.02.2019
comment
ใช่แน่นอน โดยจะตรวจสอบว่ามีการจองระหว่าง 2019-02-04 10:00 น. และ 2019-01-03 13:00 น. - person Dialex; 05.02.2019
comment
ฉันมีเรื่องกังวลนิดหน่อย ในกรณีที่ place_id มีหลายรายการ ฉันจะตรวจสอบได้อย่างไร ฉันหมายถึงเช่น place_id = 1,2 - person user9437856; 05.02.2019
comment
คงไม่มีปัญหา คุณสามารถเพิ่มเงื่อนไขอื่นให้กับสถานที่ได้ เช่น WHERE (venue_id = 1 OR venue_id = 2) AND ... - person Dialex; 05.02.2019
comment
ก่อนไม่กี่วัน ฉันจะเปลี่ยนตารางและรหัสสถานที่ ฉันหมายถึงตอนนี้ฉันได้รับรหัสสถานที่ในคอลัมน์เช่น 1,3,4.... ฉันได้รับข้อผิดพลาดที่ไม่รู้จักคอลัมน์ '1,3,4' ใน 'ที่ ข้อ ' ฉันควรใช้เพื่อระเบิดฟังก์ชั่นนี้หรือไม่? - person user9437856; 05.02.2019
comment
ฉันไม่เข้าใจ. คุณเปลี่ยนโครงสร้างตารางและ place_id เก็บมากกว่าหนึ่ง id หรือไม่ - person Dialex; 05.02.2019
comment
ให้เราสนทนาต่อในการแชท - person Dialex; 05.02.2019
comment
ฉันได้รับปัญหาเดียวกัน ฉันใช้คำตอบของคุณ แต่คราวนี้ฉันต้องตรวจสอบวัน คุณช่วยฉันในปัญหานี้ได้ไหม stackoverflow.com/questions/54721274/ - person user9437856; 17.02.2019
comment
ฉันลำบากใจที่จะพบปัญหานี้ในช่วง 8-9 วันที่ผ่านมา .. โปรดช่วยฉันด้วยปัญหานี้ .. ได้โปรด - person user9437856; 17.02.2019