Eloquent / DB在两个日期之间获得数月

时间:2017-09-11 18:08:42

标签: sql laravel date

我正在使用Laravel 5.4。

我的预订模型包含start_dateend_date。用户从下拉列表中选择一个月。

我希望Eloquent返回月份介于start_dateend_date边界之间的所有记录。

例如显示9月份的所有预订(即使预订在9月之前(或9月期间)开始,并且(布尔)在9月或之后结束。

欢迎提出任何建议。如果需要,很高兴成为一个原始的SQL语句。

5 个答案:

答案 0 :(得分:1)

这对我有用:

$start = Carbon::now()->addMonth(-1);
$end = Carbon::now()->addMonth();

$bookings = Booking::whereRaw('MONTH(created_at) > :0 AND MONTH(created_at) < :1',[
    $start->month, $end->month
])
->orWhereRaw('MONTH(created_at) = :3 AND DAYOFMONTH(created_at) >= :4', [ 
    $start->month, $start->day
])
->orWhereRaw('MONTH(created_at) = :5 AND DAYOFMONTH(created_at) <= :6', [
    $end->month, $end->day
])
->get();

如果您要排除开始日期和结束日期,可以将>=替换为>,将<=替换为<

当然,您必须更改$start$end日期。它们应该是Carbon\Carbon个对象。

答案 1 :(得分:0)

首先,在客户端或服务器端将用户选择月份解析为:

$selected = "2017-09";

然后:

Booking::where([
    ['start_time','>', $selected],
    ['end_time','<', $selected]
])->get()

答案 2 :(得分:0)

这似乎有效:

$bookings = DB::table('bookings')
            ->whereMonth('start_date', '<', $date->month)->whereMonth('end_date', '>=', $date->month)
            ->orWhere(function($query) use ($date) {
                $query->whereMonth('start_date', $date->month);
            })->get();

答案 3 :(得分:0)

应该非常简单。

我不确定&#34;月&#34;是什么格式?但是您应该使用DateTime::createFromFormat()来获取DateTime对象。如果您熟悉,请随意使用Carbon。我发现像这样的简单事情,它增加了不必要的复杂性。

然后使用它进行查询。

Booking::whereBetween($dateTime->format('Y-m-00'), [DB::raw('start_date'), DB::raw('end_date')])->get();

答案 4 :(得分:0)

添加一些解释:

Booking::whereRaw("(start_date, end_date) overlaps (date '2021-06-01', date '2021-06-30')")->get();