每月佣金计算PHP

时间:2015-09-28 21:54:29

标签: php mysql date datetime

我正在使用PHP日期遇到编码器块。让我先描绘一下我想要发生的事情。例如:

$user_join_date = new DateTime('2015-01-31');
$today_date = new DateTime('2015-04-30');

每天都会运行一个cron,对于此示例,系统将根据过去一个月的订单和数量,每隔31个月(或30个月 - 28日,具体取决于月份)计算该用户的佣金BETWEEN '2015-03-31' AND '2015-04-29'

所以我需要的是两折。首先,我需要确保我在正确的日子计算佣金,即:他们加入日期的月周年或同月的等价物。其次,我需要找到时间框架,我将计算佣金,如上面的mysql snippit所示。

出于显而易见的原因,我不能只是说:

if ($user_join_date->format('d') == $today_date->format('d')){
    calc_commission();
}

因为每个月都不会运行。如果我对任何事情都不清楚,请告诉我。

2 个答案:

答案 0 :(得分:1)

我认为您说自从注册之日起,您希望在每个用户的整数月内为每个用户提供信用。 MySQL的日期算法的一个方面是非常方便的 - INTERVAL n MONTH加法。

   DATE('2015-01-30') + INTERVAL 1 MONTH    ==>  '2016-02-28'
   DATE('2016-01-30') + INTERVAL 1 MONTH    ==>  '2016-02-29'

此功能可以解决工作日周围所有奇怪的格里高利历问题,非常好。我打算将续约日期称为日期。

现在,让我们说列signup包含用户注册时的日期/时间戳。此表达式确定最近的每月续订日期。特别是,如果它等于CURDATE(),则今天是续订日期。

 DATE(signup) + INTERVAL TIMESTAMPDIFF(MONTH, DATE(signup), CURDATE()) MONTH

下一步:这个密切相关的(duh!)表达式等于上个月的续约日期。

 DATE(signup) + INTERVAL TIMESTAMPDIFF(MONTH, DATE(signup), CURDATE())-1 MONTH

你可以采取CURDATE() - INTERVAL 1 MONTH,但这对于格里高利月末猴业务来说更为准确。试一试:即使在2016年2月底(闰年)也能正常使用。

现在,您希望在计算中使用从上一个续订日期>=开始的事务,直到当前续订日期<之前的一天结束。在MySQL中,按日期范围过滤看起来像这样。

WHERE transdate >= DATE(signup) + 
                     INTERVAL TIMESTAMPDIFF(MONTH, DATE(signup), CURDATE())-1 MONTH
  AND transdate <  DATE(signup) + 
                     INTERVAL TIMESTAMPDIFF(MONTH, DATE(signup), CURDATE()) MONTH

答案 1 :(得分:0)

$ base_dt是您的加入日期。因此,如果您将其传递给checkIt函数它将相应地提供您的真实或错误今天的日期是结算日。

$base_dt        = new DateTime('2015-04-30', new DateTimeZone("America/Chicago"));

if(checkIt($base_dt)) {
    echo "true";
    //this is the day. 
} else {
    echo "false";
    //this is not the day.
}

所以检查它的功能应该是这样.....

function checkIt($base_dt) {
    $base_d = $base_dt->format('j'); //without zeroes
    echo $base_d;
    $today        = new DateTime('now');
    $d = $today->format('j');
    echo $d;
    if($base_d == $d) {
        return true;
    } else if($base_d>28) {
        $base_dt->modify('last day of this month');
        $dif_base = $base_dt->format('j') - $base_d;    
        //echo $dif_base;

        $today->modify('last day of this month');
        $diff_today = $today->format('j') - $d;
        //echo $diff_today;

        if(($base_d==31 && $diff_today==0)||($base_d==30 && $diff_today==0 && $d<30)||($base_d==29 && $diff_today==0 && $d<29)) {
            return true;
        } 

        if($dif_base==0 && $diff_today==0) {
            return true;
        }
    }

    return false;
}