Reputation: 1015
I want to retrieve data of today from my database in Laravel.
I have already googling and applied several methods but not getting my answer.
PrescriptionTbl::whereDate('created_at', '=', $today)->get();
Where PrescriptionTbl
is the model and today
is current date like 2019-2-19
.But got NULL array.
To check the SQL I have used toSQL()
instead of get()
...and it shows below SQL in the browser
select * from `prescription_tbls` where date(`created_at`) = ?
I have also use Carbon
but also get a NULL array
PrescriptionTbl::whereDate('created_at', Carbon::today())->get();
How to solve it? Anybody Help Please?
Upvotes: 6
Views: 37218
Reputation: 568
Another way to get the exact record of today's transactions is by using the like
operator in conjunction with Carbon for example in Laravel 9+:
<?php
$date = Carbon::now();
$todaySales = Sales::query()
->where("created_at", "like", "%{$date->today()->toDateString()}%")
->get();
dd($todaySales);
The above will return an array of records for today.
Now why do we use this approach? I want you to take a good look at the created_at column field this is how it looks like: 2023-04-14 11:33:23
. With this using where statement the result will be an empty array why? Because where statement uses an =
operator by default which means the sql statement will attempt to match the records exactly the way it is. Here is how the query will look like:
SELECT * FROM sales WHERE created_at={$todaysDate}
// in this case todays date is 2023-04-14
// but the value in the database is rather containing time
// e.g.: 023-04-14 11:33:23 so definitely the select operation will fail and return empty results.
Looking at the above query there's no way the sql query is going to evaluate to any result but with the like
operator the sql query will attempt to search for records that has todays date in them: 2023-04-14
which will return all records for today. If you're looking to retrieve records from a range let's say from Monday through to Friday you can use Laravel whereBetween()
method otherwise try this approach. Hope this help you solve the problem.
You can also checkout this article for more info
Upvotes: 0
Reputation: 1585
Using Carbon ( use Carbon\Carbon; ) its simple and pretty
PrescriptionTbl::whereDate('created_at', Carbon::today()->toDateString())->get();
Upvotes: 1
Reputation: 986
You can get it via new DateTime()
class
PrescriptionTbl::whereDate('created_at', '=', (new DateTime)->format('Y-m-d'))->get();
Upvotes: 2
Reputation: 379
You can use whereBetween
in which you can provide start date of today as 2019-01-01 00:00:00
and end date as 2019-01-01 23:59:59
For reference How to query between two dates using Laravel and Eloquent ORM?
Upvotes: 0
Reputation: 1050
You can use that;
PrescriptionTbl::whereDate('created_at', date('Y-m-d'))->get();
Upvotes: 12
Reputation: 119
created_at is a timestamp which is date/time format, so, equal operator wouldn't work unless you provided the whole timestamp.
you can use whereDate method to compare dates only as mentioned in documentation
PrescriptionTbl::whereDate('created_at', $today)->get();
Upvotes: 0
Reputation: 234
You can try this one:
PrescriptionTbl::where('created_at', '<=', date('Y-m-d 00:00:00'))->get();
Upvotes: 0