web-dev-qa-db-ja.com

Laravel datetimeフィールドからの雄弁な比較日付

式からテーブルのすべての行を取得したい:

table.date <= 2014-07-10

ただし、列に日時が含まれている場合は、次のように言います。

2014-07-10 12:00:00

しかし、私がそうするなら:

where('date', '<=', $date)

行を取得しません。

これは、$ date = 2014-07-10であり、MySQLが2014-07-10 00:00:00であると想定するためです。

通常のMySQLでは

where DATE(date) <= $date

LaravelのEloquentを使用すると、同等のものは何でしょうか?

34
almo

Laravel 4+は、これらのメソッドを提供します:whereDay()whereMonth()whereYear()#3946 )およびwhereDate()#6879 )。

SQL DATE()の作業を行い、SQLiteの違いを管理します。

結果は次のように達成できます。

->whereDate('date', '<=', '2014-07-10')

その他の例については、最初のメッセージ #3946 およびこの Laravel Daily article を参照してください。


更新:上記の方法は便利ですが、Arthが述べているように、大規模なデータセットではDATE() SQL関数は各レコードに適用する必要があるため、可能なインデックスを破棄します。

以下に比較を行う方法をいくつか示します(ただし、以下の注意事項をお読みください)。

->where('date', '<=', '2014-07-10 23:59:59')

->where('date', '<', '2014-07-11')

// '2014-07-11'
$dayAfter = (new DateTime('2014-07-10'))->modify('+1 day')->format('Y-m-d');

->where('date', '<', $dayAfter)

ノート:

  • 23:59:59は1秒の精度のため(今のところ)大丈夫ですが、この記事をご覧ください: 23:59:59は一日の終わりではありません。いや、本当に! =
  • 「ゼロ日付」の場合(「0000-00-00 00:00:00」)に注意してください。これらの「ゼロ日付」は避けるべきですが、非常に多くの問題の原因です。必要に応じて、フィールドをNULL可能にした方が良いでしょう。
62
Gras Double

使用を検討しましたか:

where('date', '<', '2014-08-11')

MySQLのインデックス付きカラムでDATE()関数を使用しないでください。これにより、エンジンがインデックスを使用できなくなります。

UPDATE

DATE()とインデックスの重要性については意見の相違があるように思えるので、違いを示す fiddle を作成しました。POSSIBLE KEYSを参照してください。

6
Arth

日付 '2016-07-14'のすべてのレコードを取得できます

 whereDate('date','=','2016-07-14')

または動的な日付に別のコードを使用

whereDate('date',$date)
3
Majbah Habib

これを使用できます

whereDate('date', '=', $date)

WhereDateを指定すると、datetimeフィールドの日付のみを比較します。

1
Jakir Hossain

それでも解決する方法を疑問に思っている場合。

私が使う

$protected $dates = ['created_at','updated_at','aired'];

私のモデルとどこで

where('aired','>=',time())

そのため、Unixを使用してどこで比較するかを決めてください。

一方、ビューでは、日付オブジェクトを使用する必要があります。

それが誰かを助けることを願っています!

0
pixie_frigo