Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP calculate financial year

I want to calculate the financial year using php to get data from mysql tables.

The requirement is to calculate student score in every financial year (31 march to 1 April). Is it possible to make any function that calculates these dates by itself every year?

My table for students test score is storing test dates (2-sep-2012) and it has old record also for same student of (2-sep-2011) this year. I want out put of current year only. until now I can't get this, here is my code:-

$result1 = mysql_query(
    "SELECT SUM(score), SUM(score_from) 
     FROM school_test_report, school_students 
     WHERE (school_test_report.student_id = school_students.student_id and
school_test_report.class=school_students.class) 
     AND school_test_report.student_id='$id'
     AND school_test_report.subject = 'maths'
    /* something here to get dates  school_test_report.test_date is between 31 march to 1 April */"
)
or die(mysql_error());  
$row = mysql_fetch_assoc($result1);
echo $row['SUM(score)'].'/'. $row['SUM(score_from)'];

Its giving me over all result not for one financial year.

like image 508
Harinder Avatar asked Oct 18 '25 11:10

Harinder


1 Answers

When performing calculations on dates it is a good idea to extend the DateTime class. This keeps all your date calculations encapsulated and in one place. Over time you will build up a very useful library.

To calculate the fiscal year you could extend DateTime thus:-

class MyDateTime extends DateTime
{
    /**
    * Calculates start and end date of fiscal year
    * @param DateTime $dateToCheck A date withn the year to check
    * @return array('start' => timestamp of start date ,'end' => timestamp of end date) 
    */
    public function fiscalYear()
    {
        $result = array();
        $start = new DateTime();
        $start->setTime(0, 0, 0);
        $end = new DateTime();
        $end->setTime(23, 59, 59);
        $year = $this->format('Y');
        $start->setDate($year, 4, 1);
        if($start <= $this){
            $end->setDate($year +1, 3, 31);
        } else {
            $start->setDate($year - 1, 4, 1);
            $end->setDate($year, 3, 31);
        }
        $result['start'] = $start->getTimestamp();
        $result['end'] = $end->getTimestamp();
        return $result;
    }
}

This will give a result you can easily include into your query (which you should really change to mysqli or pdo if you can).

You can use the new function like this:-

$mydate = new MyDateTime();    // will default to the current date time
$mydate->setDate(2011, 3, 31); //if you don't do this
$result = $mydate->fiscalYear();
var_dump(date(DATE_RFC3339, $result['start']));
var_dump(date(DATE_RFC3339, $result['end']));

If you wish you could modify the method to return the start and end dates as DateTime objects:-

$result['start'] = $start;
$result['end'] = $end;
return $result;

Which you can then format directly for inclusion in your query:-

$mydate = new MyDateTime();
$mydate->setDate(2011, 3, 31);
$result = $mydate->fiscalYear();
$start = $result['start']->format('Y M d');
$end = $result['end']->format('Y M d');

See the manual for date formats

like image 88
vascowhite Avatar answered Oct 21 '25 02:10

vascowhite