Solved

# Date Ranges by quarters

Posted on 2006-11-25
3,566 Views
I am trying to set a start date and end date by the quarter.

For example, I am working on a reporting system where i need to report data for quarter 1, quarter 2, quarter 3, and quarter 4.

Quarter One - January - March
Quarter Two - April - June
Quarter Three - July - September
Quarter Four - October - December

I have for example some cases for the current month, and the previous month as shown below.

case 'this_month':
\$start_date = date(DATE_FORMAT, mktime(0, 0, 0, date("m"), 1, date("Y")));
\$end_date = date(DATE_FORMAT, mktime(0, 0, 0, date("m"), date("d"), date("Y")));
break;
case 'last_month':
\$start_date = date(DATE_FORMAT, mktime(0, 0, 0, date("m") - 1, 1, date("Y")));
\$end_date = date(DATE_FORMAT, mktime(0, 0, 0, date("m"), 0, date("Y")));
break;

But now i need to add cases for each quarter and I am not sure how to actually do that so it reflects the proper quarter range, like quarter 1 always being January thru March.

Any Ideas?
0
Question by:redcable
• 2

LVL 8

Expert Comment

ID: 18012990
\$periods[1] = array( 'start'=>'1/1' , 'end'=>'3/31' );
\$periods[2] = array( 'start'=>'4/1' , 'end'=>'6/30' );
\$periods[3] = array( 'start'=>'7/1' , 'end'=>'9/30' );
\$periods[4] = array( 'start'=>'10/1' , 'end'=>'12/31' );

// you might want to append the year to the dates, programatically
\$q = 1;

\$query = "select data from table where date >= '".\$periods[\$q]['start'] ."' and date <= '" . \$periods[\$q]['end'] ."'"

That gets a single quarter of data.

If you need to group results by the quarter, you should add a column to the data (either permanently or in a temporary table), that stores the quarter.  Then, all you need to do is "group by quarter".  (If you're going to run this query a lot, just add the column as a permanent thing and add code to insert the proper quarter.)
0

Author Comment

ID: 18013161
not exactly what i was looking for. is there way using this format

date(DATE_FORMAT, mktime(0, 0, 0, date("m") - 1, 1, date("Y")));

to make that mean 1/1/current year.
0

LVL 14

Accepted Solution

TedInAK earned 500 total points
ID: 18013275
The following two functions should do what you need.  If the month is a single digit, e.g., '7', a zero is prepended - '07'.

function getQuarterStart(\$quarterNum) {
}

function getQuarterEnd(\$quarterNum) {
return str_pad(\$quarterNum * 3, 2, '0', STR_PAD_LEFT) . '/' . cal_days_in_month(CAL_GREGORIAN, \$quarterNum * 3, date('Y'));
}

Usage:
\$qNum = 4;
echo 'Start: ' . getQuarterStart(\$qNum) . '/' . date('Y') . '<br>';
echo 'End: ' . getQuarterEnd(\$qNum) . '/' . date('Y');

Output:
Start: 10/01/2006
End: 12/31/2006
0

LVL 8

Expert Comment

ID: 18013635
Sorry about that - I misinterpreted the code.  TedInAK's right.

If you need to get from the current month to the quarter number:

\$quarter = floor( \$month / 4 ); // where month is 0 to 11

Then use those two functions to get the dates.
0

## Featured Post

Foreword (July, 2015) Since I first wrote this article, years ago, a great many more people have begun using the internet.  They are coming online from every part of the globe, learning, reading, shopping and spending money at an ever-increasing ra…
Password hashing is better than message digests or encryption, and you should be using it instead of message digests or encryption.  Find out why and how in this article, which supplements the original article on PHP Client Registration, Login, Logo…
Learn how to match and substitute tagged data using PHP regular expressions. Demonstrated on Windows 7, but also applies to other operating systems. Demonstrated technique applies to PHP (all versions) and Firefox, but very similar techniques will w…
The viewer will learn how to create a basic form using some HTML5 and PHP for later processing. Set up your basic HTML file. Open your form tag and set the method and action attributes.: (CODE) Set up your first few inputs one for the name and …