cari

Rumah  >  Soal Jawab  >  teks badan

Bagaimana untuk menyemak sama ada tempoh masa bertindih dengan tempoh masa lain dalam PHP Laravel

<p>Bagaimana untuk menyemak sama ada waktu bekerja pengguna tertentu untuk tempoh masa tertentu sudah wujud dalam pangkalan data. Oleh itu, fungsi harus kembali benar apabila waktu bekerja bertindih dengan tarikh dan masa yang diberikan. Saya mencubanya tetapi tidak berkesan. </p> <pre class="brush:php;toolbar:false;">function checkExistingWorkingHours($user_id, $start_date, $start_time, $end_date, $end_time) { // dd($user_id . " " . $start_date . " " . $start_time . " " . $end_date . " " . $end_time); $startDateTime = Carbon::parse($start_date . ' ' . $start_time); $endDateTime = Carbon::parse($end_date . ' ' . $end_time); $overlapExists = WorkingHour::where('user_id', $user_id) ->di mana(fungsi ($pertanyaan) gunakan ($startDateTime, $endDateTime) { $query->where(function ($query) use ($startDateTime, $endDateTime) { // Semak pertindihan di mana start_datetime adalah antara start_datetime dan end_datetime sedia ada $query->where(function ($query) use ($startDateTime, $endDateTime) { $query->where('start_date', '=', $startDateTime->format('Y-m-d')) ->di mana('start_time', '<', $endDateTime->format('H:i')) ->di mana('tarikh_akhir', '=', $startDateTime->format('Y-m-d')) ->where('end_time', '>', $startDateTime->format('H:i')); })->orWhere(function ($query) use ($startDateTime, $endDateTime) { $query->where('start_date', '<', $startDateTime->format('Y-m-d')) ->di mana('tarikh_akhir', '=', $startDateTime->format('Y-m-d')) ->where('end_time', '>', $startDateTime->format('H:i')); }); })->orWhere(function ($query) use ($startDateTime, $endDateTime) { // Semak pertindihan di mana end_datetime adalah antara start_datetime sedia ada dan end_datetime $query->where(function ($query) use ($startDateTime, $endDateTime) { $query->where('start_date', '=', $endDateTime->format('Y-m-d')) ->di mana('tarikh_akhir', '>=', $endDateTime->format('Y-m-d')) ->where('start_time', '<', $endDateTime->format('H:i')); })->orWhere(function ($query) use ($startDateTime, $endDateTime) { $query->where('start_date', '<=', $startDateTime->format('Y-m-d')) ->di mana('tarikh_akhir', '>=', $endDateTime->format('Y-m-d')); }); }); })->wujud(); pulangkan $overlapExists; }</pre> <p>Apabila saya menguji fungsi dengan data berikut, ia mengatakan terdapat pertindihan walaupun tiada pertindihan.</p> <p>Semak waktu kerja sedia ada (1, 2023-06-01, 00:15, 2023-06-01, 03:00);</p> <p>Nilai dalam pangkalan data ialah 2023-06-01 03:30 hingga 11 malam. </p>
P粉011360903P粉011360903458 hari yang lalu623

membalas semua(2)saya akan balas

  • P粉515066518

    P粉5150665182023-09-03 16:58:44

    Cuba guna ini

    $start = Carbon::parse($start_date . ' ' . $start_time)->stratOfDay();
    $end = Carbon::parse($end_date . ' ' . $end_time)->endOfDay();
    $overlapExists = WorkingHour::where('user_id', $user_id)->whereBetween('your column',[$start , $end])->exists();

    balas
    0
  • P粉014218124

    P粉0142181242023-09-03 12:51:18

    Jawapan berdasarkan komen geertjanknapen:

    $period = CarbonPeriod::create("$start_date $start_time", "$end_date $end_time");
    $start = Carbon::create("$to_check->start_date $to_check->start_time");
    $end = Carbon::create("$to_check->end_date $to_check->end_time");
    
    
    if ($period->overlaps($start, $end)) {
        return redirect()->back()->withInput()->with('error',"Time is overlapping!");
    }

    balas
    0
  • Batalbalas