मित्रों मैं यह पता लगाने की कोशिश कर रहा हूं कि मैं दो बार के बीच आंशिक ओवरलैपिंग की जांच कैसे कर सकता हूं। मूल रूप से, मेरे समय इस तरह एक डेटाबेस में सहेज रहे हैं: - यहां छवि विवरण दर्ज करें

Batch::find()->alias('batch')->joinWith([
            'batchTeachers as teacher',
            'attendanceDates as attendanceDates',
            'batchTiming as batchTiming'
        ])->where([
            'OR', [
                'IN',
                'teacher.teacher_id',
                $teacher_id
            ],
            [
                'IN',
                'batch.teacher_id',
                $teacher_id
            ]
        ])->andWhere([
            'attendanceDates.date' => $date
        ])->andWhere([
            'OR',
            [
                'AND',
                [
                    '>=',
                    'batchTiming.start_time',
                    $calenderStartTime
                ],
                [
                    '<=',
                    'batchTiming.end_time',
                    $calenderEndTime
                ]

            ], [
                'AND', [
                    '<=',
                    'attendanceDates.start_time',
                    $calenderEndTime
                ], [
                    '>=',
                    'attendanceDates.end_time',
                    $calenderEndTime
                ]
            ]

        ])->exists()

उपरोक्त क्वेरी का रॉ SQL है:

SELECT `batch`.* FROM `tbl_batch` `batch` LEFT JOIN `tbl_attendance_batch_teacher` `teacher` ON `batch`.`id` = `teacher`.`batch_id` LEFT JOIN `tbl_attendance_date` `attendanceDates` ON `batch`.`id` = `attendanceDates`.`batch_id` LEFT JOIN `tbl_batch_timing` `batchTiming` ON `batch`.`id` = `batchTiming`.`batch_id` WHERE ((`teacher`.`teacher_id`=1294) OR (`batch`.`teacher_id`=1294)) AND (`attendanceDates`.`date`='2021-01-06') AND (((`batchTiming`.`start_time` >= '08:00:00') AND (`batchTiming`.`end_time` <= '09:00:00')) OR ((`attendanceDates`.`start_time` <= '09:00:00') AND (`attendanceDates`.`end_time` >= '09:00:00'))) ORDER BY `date`

मेरी समस्या यह है कि यदि उपयोगकर्ता के पास सुबह 9 से 11 बजे के बीच बैच है

अगर वह सुबह 9 से 11 बजे तक व्यस्त है तो पूर्ण ओवरलैपिंग (RED COLOR)

अगर वह सुबह 9 से 10 बजे तक व्यस्त है तो आंशिक ओवरलैपिंग (नीला रंग)

0
Dev 1 21 जिंदा 2021, 07:12

1 उत्तर

सबसे बढ़िया उत्तर

आपको अपने SQL चयन में CASE WEN कथन का उपयोग करने की आवश्यकता है

SELECT
    ` batch `.*,
        CASE
                WHEN ( ` batchTiming `.` start_time ` >= '08:00:00' AND ` batchTiming `.` end_time ` <= '09:00:00' ) THEN 1 -- partial overlap
                WHEN ( ` attendanceDates `.` start_time ` <= '09:00:00' AND ` attendanceDates `.` end_time ` >= '09:00:00' ) THEN 2 -- full overlap
                ELSE 0 -- no overlap
        END as overlap_value

FROM

यहां देखें

आगे इसे सक्रिय क्वेरी में बदलने के लिए नीचे की तरह चुनिंदा क्लॉज जोड़ें ...

Batch::find()
    ->alias('batch')
    ->select([ 'T.*', 'othrTable.*', ' CASE STATEMENT HERE as overlap_value'])
    ->joinWith( [...

और अपने बैच मॉडल में संपत्ति के रूप में $overlap_value जोड़ें।

1
ajitpawarinc 21 जिंदा 2021, 11:32
इसे साझा करने के लिए धन्यवाद लेकिन क्या इसे बदलने का कोई तरीका है ActiveQuery ?
 – 
Dev 1
21 जिंदा 2021, 10:33