如何过滤laravel的时间戳?

如何过滤laravel的时间戳?

问题描述:

I want to filter the result of the records within the period, but i can't find any example of how to use the where clause to get the exact range of data.

These are the data posted from form:

[monthRangeStart] => 12

[yearRangeStart] => 2013

[monthRangeEnd] => 12

[yearRangeEnd] => 2013

and the following is the format of updated_at timestamp

2013-12-18 07:22:34

How should i finish the line of code

$trans = Transaction::where('updated_at', )

In my opinion if you decided to use some framework you should use tools it provides in order to create better solutions. Laravel has very beautiful Carbon class for date manipulation. This is solution I came to:

$trans = Transaction::whereBetween('updated_at', [
    \Carbon\Carbon::createFromDate(Input::get('yearRangeStart'), Input::get('monthRangeStart'))->startOfMonth(),
    \Carbon\Carbon::createFromDate(Input::get('yearRangeEnd'), Input::get('monthRangeEnd'))->endOfMonth()
])->get();

In this case you will never go wrong with number of days in any specific month.

This should do it...

$trans = Transaction::where('updated_at', '>', "$yearRangeStart-$monthRangeStart-00 00:00:00")
    ->where('updated_at', '<', "$yearRangeEnd-$monthRangeEnd-31 99:99:99")
    ->get();

If you decide you need to filter on the days/hours/minutes/seconds as well, you can replace those as you go.

You may try something like this

$start = Input::get('yearRangeStart') . '-' . Input::get('monthRangeStart');
$end = Input::get('yearRangeEnd') . '-' . Input::get('monthRangeEnd') . '-' . '31'; 
$trans = Transaction::whereBetween('updated_at', array($start, $end))->get();

Update :

$start = Input::get('yearRangeStart') . '-' . Input::get('monthRangeStart');
$endYear = Input::get('yearRangeEnd');
$endMonth = Input::get('monthRangeEnd');
$endDays = cal_days_in_month(CAL_GREGORIAN, $endMonth, $endYear);
$end = $endYear . '-' . $endMonth . '-' . $endDays; 

$trans = Transaction::whereBetween('updated_at', array($start, $end))->get();