使用DATE_FORMAT()向Laravel Querybuilder(或Eloquent)进行MySQL查询

时间:2019-05-15 09:11:18

标签: mysql laravel eloquent

我正在尝试在特定日期从表中获取记录。 日期格式:datetime(YYYY-MM-DD HH:II:SS)

我正在尝试将MySQL查询转换为Laravel查询生成器。但是我不知道如何处理DATE_FORMAT()。

这是MySQL查询

SELECT * FROM events
JOIN customers ON events.id_customer = customers.id
WHERE start_date > DATE_FORMAT("2017-06-15", "%Y-%m-%d %H:%i:%s")
AND end_date < DATE_FORMAT("2017-06-16", "%Y-%m-%d %H:%i:%s")
;

在控制器中,我得到了放入DateTime中的日期(字符串)

$date_datetime = new \DateTime(Input::get('date_string'));

然后更改其格式

$query_date = date_format($date_datetime, 'Y-m-d H:i:s');

我尝试了以下代码,但显然不起作用

$pdf_events = DB::table('events')
->join('customers', 'events.id_customer', '=', 'customers.id')
->select(...)
->whereRaw("start_date > DATE_FORMAT($query_date, '%Y-%m-%d %H:%i:%s')")
->whereRaw("end_date < DATE_FORMAT($query_date, '%Y-%m-%d %H:%i:%s')+1")
->get();

4 个答案:

答案 0 :(得分:1)

我强烈建议使用Carbon在Laravel中处理DateTime,因为它具有开箱即用的支持。

现在,如何使用它来解决您的问题?

首先,您需要将输入转换为Carbon对象。

$start_date = Carbon::parse(Input::get('date_string'));

// Assuming you want the end date 1 day later at same time
$end_date = $start_date->addDay();


// You could change the format with format() but in this case we don't need to

然后在您的口才中,您可以使用Carbon日期时间对象来使用where()

进行查询
$pdf_events = DB::table('events')
->join('customers', 'events.id_customer', '=', 'customers.id')
->select(...)
->where("start_date", ">", $start_date)
->where("end_date", "<", $end_date)
->get();

答案 1 :(得分:0)

您可以传递Carbon(doc)对象以比较日期。例如:

->where('start_date', '=', Carbon::now())

您可以为自定义日期时间构建自定义Carbon对象,以传递到where子句中。

答案 2 :(得分:0)

您不需要DATE_FORMAT,请尝试以下操作:


$query_start_date = \Carbon\Carbon::createFromFormat("Y-m-d H:i:s", request()->date_string);

// Add 1 day to the date
$query_end_date = $query_start_date->addDay();



$pdf_events = DB::table('events')
    ->join('customers', 'events.id_customer', '=', 'customers.id')
    ->where(
        [
            ["start_date", ">", $query_start_date],
            ["end_date", "<", $query_end_date]
        ]
    )->get();

答案 3 :(得分:0)

use Datetime;

$end_date1 = $request->input('end_date');
$EndDateTime = DateTime::createFromFormat('d/m/Y H:i:s', $end_date1);
$end_date = $EndDateTime->format('Y-m-d H:i:s');

试试这样对我有用