您如何在time不包括兩個范圍本身的兩個范圍之間進行查詢?
我有一個查詢時間的作業代碼,whereBetween但我遇到了問題,因為我只想獲取這兩個時間范圍之間的記錄,不包括它們自己。
我的schedules桌子上有這些行:
---------- ------------------ ---------------- -------------
| id | start_time | end_time | user_id |
---------- ------------------ ---------------- -------------
| 1 | 06:45:00 | 07:45:00 | 1 |
| 2 | 10:30:00 | 11:30:00 | 1 |
---------- ------------------ ---------------- -------------
我正在做的步驟:
schedules向表中添加新記錄。- 假設我的新記錄
start_time包含07:45:00 和08:45:00end_time。 - 使用下面的代碼檢查要添加的記錄之間是否有任何記錄。
$startTime我用來檢查和之間是否有一行的代碼$endTime。
$userId = 1;
$startTime = Carbon::parse('07:45')->format('H:i:s');
$endTime = Carbon::parse('08:45')->format('H:i:s');
$checkScheduleIfExists = Schedule::where('user_id', $userId)
->where(function ($query) use ($startTime, $endTime) {
$query->whereBetween('start_time', [
$startTime, $endTime
])
->orWhereBetween('end_time', [
$startTime, $endTime
]);
})
->first();
dd($checkScheduleIfExists);
// this returns the row id 1, 06:45:00 - 07:45:00
上面代碼的問題是它$startTime在schedules表end_time中找到07:45:00并回傳該行,如果找到$endTimein 也是如此start_time。
如果$startTime(07:45:00) 占用的值低于end_time我的表中存在的schedules值,例如7:40:00 ,我期望的只是回傳一行(知道存在一條記錄) 。
uj5u.com熱心網友回復:
這是一個非常標準的問題。簡短的回答是:給定一個從 開始到S結束的區間E,獲取重疊區間的資料庫查詢應該如下所示:
where start<E and end>S
解釋:
為了可視化(并更好地記住)這一點,請想象兩個不重疊的間隔。讓我們稱它們為S1-E1and S2-E2。
如果它們不重疊,則意味著其中一個在前,另一個在后。我們不知道哪個是哪個,所以要么E1 <= S2(第一個在第二個開始之前結束)或E2 <= S1(第二個在第一個開始之前結束)。
現在我們已經把它寫下來了,很容易得到兩個間隔以某種方式重疊的所有情況——只需not在這個條件前面加上一個(否定)。所以,用公式說話:not(E1 <= S2 or E2 <= S1). 此條件考慮了區間如何可能重疊的所有可能方式,包括一個區間完全包括另一個區間,或區間部分重疊。
我們可以通過打開括號進一步簡化這個運算式,在這種情況下我們得到E1 > S2 and E2 > S1.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/520027.html
標籤:php拉拉维尔
