Laravel Eloquent compare date from datetime field

PhpMysqlDatetimeLaravel 4

Php Problem Overview


I want to get all the rows from a table through an expression:

table.date <= 2014-07-10

But if the column contains a datetime let's say:

2014-07-10 12:00:00

But if I do:

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

it won't get the row.

I guess this is because $date = 2014-07-10 which makes MySQL assume that it is 2014-07-10 00:00:00.

In regular MySQL I would just do

where DATE(date) <= $date

What would be the equivalent using Laravel's Eloquent?

Php Solutions


Solution 1 - Php

Laravel 4+ offers you these methods: whereDay(), whereMonth(), whereYear() (#3946) and whereDate() (#6879).

They do the SQL DATE() work for you, and manage the differences of SQLite.

Your result can be achieved as so:

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

For more examples, see first message of #3946 and this Laravel Daily article.


Update: Though the above method is convenient, as noted by Arth it is inefficient on large datasets, because the DATE() SQL function has to be applied on each record, thus discarding the possible index.

Here are some ways to make the comparison (but please read notes below):

->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)

Notes:

  • 23:59:59 is okay (for now) because of the 1-second precision, but have a look at this article: 23:59:59 is not the end of the day. No, really!
  • Keep in mind the "zero date" case ("0000-00-00 00:00:00"). Though, these "zero dates" should be avoided, they are source of so many problems. Better make the field nullable if needed.

Solution 2 - Php

Have you considered using:

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

You should avoid using the DATE() function on indexed columns in MySQL, as this prevents the engine from using the index.

UPDATE

As there seems to be some disagreement about the importance of DATE() and indexes, I have created a fiddle that demonstrates the difference, see POSSIBLE KEYS.

Solution 3 - Php

You can get the all record of the date '2016-07-14' or before '2016-07-14' by choosing one syntax from follows:

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

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

Or use the another code for dynamic date

whereDate('date',$date)

Solution 4 - Php

You can use this

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

If you give whereDate then compare only date from datetime field.

Solution 5 - Php

If you're still wondering how to solve it.

I use

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

In my model and in my where i do

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

So just use the unix to compare in where.

In views on the other hand you have to use the date object.

Solution 6 - Php

Here is my logic: if you are comparing date then your method should be whereDate and if your comparing complete datetime then your method will be only where:

$calendar_alert = DB::table('calendar_alerts')->whereDate('when', '=', now()->format('Y-m-d'))->where('when', '>', now()->format('H:i:s'))->get();

Solution 7 - Php

use Carbon\Carbon;

public function scopePublished($query)
{
  $now = Carbon::now();
  $date = Carbon::parse($now)->toDateString();
  $time = Carbon::parse($now)->toTimeString();
  return $query->whereDate('published_at', '<', $date)
  ->orWhere(function($query) use ($date, $time) {
    $query->whereDate('published_at', '=', $date)
    ->whereTime('published_at', '<=', $time);
  });
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionalmoView Question on Stackoverflow
Solution 1 - PhpGras DoubleView Answer on Stackoverflow
Solution 2 - PhpArthView Answer on Stackoverflow
Solution 3 - PhpMajbah HabibView Answer on Stackoverflow
Solution 4 - PhpJakir HossainView Answer on Stackoverflow
Solution 5 - Phppixie_frigoView Answer on Stackoverflow
Solution 6 - PhpfahdshaykhView Answer on Stackoverflow
Solution 7 - PhpVantooseView Answer on Stackoverflow