laravel
  • laravel-5
  • 2017-05-24 26 views 0 likes 
    0

    注意:代碼應該適用於postgres和mysql。Laravel的where不包括日期從

    我想通過date_fromdate_to來查詢表格。比方說,有一個日期範圍格式:('d-m-Y')

    富:

    [ 
    {'id': 1, "created_at": "2017-05-20 11:18:00"}, 
    {'id': 2, "created_at": "2017-05-24 11:38:36"} 
    ] 
    

    代碼:

    $format = 'd-m-Y'; 
    $df = $request->input('date_from'); 
    $dt = $request->input('date_to'); 
    $date_from = Carbon::createFromFormat($format, $df); 
    $date_to = Carbon::createFromFormat($format, $dt); 
    
    Foo::whereBetween('created_at', [$date_from, $date_to])->get()->toArray(); 
    

    當我查詢date_from = '20-05-2017'date_to = '20-05-2017',我看到一個空數組。無論如何我期望看到20-05-2017 Foo的。如果我是date_from = '19-05-2017'date_to = '21-05-2017',我看到20-05-2017的數組。

    whereBetween怎麼了?

    回答

    1

    它按預期工作。您遇到的問題主要是您要求在完全相同的時間戳之間的時間。雖然你只是指定一個特定的日子,而不是一個時間,但是包含一個時間。在這種情況下,很可能恰好是午夜。因此'20-05-2017'變成'20-05-2017 00:00:00'。在這種情況下,除了確切的時間外,沒有其他時間可以滿足您的whereBetween呼叫。

    如果你想獲得一個特定日期的記錄你最簡單的解決辦法是使用:

    $query->whereRaw('date(created_at) = ?', [date('Y-m-d')]); 
    

    如果您正在尋找2個不同日期之間的查詢,當前的方法會奏效。

    如果你想開始的時間是白天和結束時間的開始是一天結束時,你可以使用碳的modifiers這個startOfDayendOfDay

    $date_from = Carbon::parse($request->input('date_from'))->startOfDay(); 
    $date_to = Carbon::parse($request->input('date_to'))->endOfDay(); 
    
    $result = Foo::whereDate('created_at', '>=', $date_from) 
        ->whereDate('created_at', '<=', $date_to) 
        ->get() 
        ->toArray(); 
    
    +0

    「startOfDay」和「endOfDay」做了詭計!謝啦。 – brunoramonalmeida

    3

    它工作正常。

    問題是,你在哪裏通過的日期只有Y-m-d格式,而laravel正在比較這種格式與Y-m-d H:i:s格式的created_at列。

    當您僅通過Y-m-d時,它將被轉換爲Y-m-d 00:00:00。所以你的created_at 2017-05-20 11:18:00不在20-05-2017 00:00:0020-05-2017 00:00:00之間。

    +0

    感謝您的。現在我明白了。但是請原諒我,我必須獎勵給出編碼答案的人。我已經給你upvote,雖然;);) – Sylar

    1

    createFromFormat根據給定的輸入創建日期並用當前時間替換缺失的時間。因此,使用parse代替,您甚至不需要指定表單。其次,您使用的是whereBetween,它檢查完整的時間戳,而不僅僅是日期。您的第一排2017-05-20 11:18:00超出了日期範圍,因此它不會返回該值。您需要使用whereDate來檢查基於日期的項目,而忽略時間。

    $date_from = Carbon::parse($request->input('date_from')); 
    $date_to = Carbon::parse($request->input('date_to')); 
    
    $result = Foo::whereDate('created_at', '>=', $date_from) 
        ->whereDate('created_at', '<=', $date_to) 
        ->get() 
        ->toArray(); 
    
    相關問題