Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 每月佣金计算_Php_Mysql_Date_Datetime - Fatal编程技术网

Php 每月佣金计算

Php 每月佣金计算,php,mysql,date,datetime,Php,Mysql,Date,Datetime,我遇到了一个PHP日期代码块。让我先描绘一下我想发生的事情。例: $user_join_date = new DateTime('2015-01-31'); $today_date = new DateTime('2015-04-30'); 每天都会运行cron,在本例中,每31日(或30-28日,取决于月份),系统将根据上个月的订单和数量计算该用户的佣金,“2015-03-31”和“2015-04-29” 所以我需要的是双重的。首先,我需要确保我在正确的日期计算佣金,即:他们加入日期的每月周

我遇到了一个PHP日期代码块。让我先描绘一下我想发生的事情。例:

$user_join_date = new DateTime('2015-01-31');
$today_date = new DateTime('2015-04-30');
每天都会运行cron,在本例中,每31日(或30-28日,取决于月份),系统将根据上个月的订单和数量计算该用户的佣金
,“2015-03-31”和“2015-04-29”

所以我需要的是双重的。首先,我需要确保我在正确的日期计算佣金,即:他们加入日期的每月周年纪念日或同月的同等日期。其次,我需要找到计算佣金的时间范围,如上面mysql snippit中所示

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

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

因为它不会每个月都运行。如果我有什么不清楚的地方,请告诉我。

我想你是说你想在每个用户注册后的整数个月内对其进行积分。MySQL的日期算法有一个方面非常方便--
INTERVAL n MONTH
addition

   DATE('2015-01-30') + INTERVAL 1 MONTH    ==>  '2016-02-28'
   DATE('2016-01-30') + INTERVAL 1 MONTH    ==>  '2016-02-29'
这个特性很好地处理了平日里所有奇怪的公历问题。我将把这个日期称为续约日期

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

 DATE(signup) + INTERVAL TIMESTAMPDIFF(MONTH, DATE(signup), CURDATE()) MONTH
下一步:这个密切相关的(duh!)表达式等于上个月的续订日期

 DATE(signup) + INTERVAL TIMESTAMPDIFF(MONTH, DATE(signup), CURDATE())-1 MONTH
您可以只取
CURDATE()-间隔1个月
,但对于公历月末的猴子业务,这要准确得多。试试看:它甚至在2016年2月底(闰年日)也能正常工作

现在,您需要在计算中使用从上一个续订日期开始到当前续订日期前一天结束的事务。在MySQL中,按该日期范围进行过滤如下所示。/p precodeWHERE transdate>=日期(注册)+ 时间间隔时间差(月、日期(注册)、CURDATE())-1个月 和转换日期<日期(注册)+ 时间间隔时间差(月、日期(注册)、CURDATE())月
$base\u dt是您的加入日期。所以,如果您将其传递给checkIt函数,它将相应地为您提供true或false,无论今天是否是计费日

$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.
}
所以check it函数应该是这样的

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;
}
函数checkIt($base\u dt){
$base_d=$base_dt->format('j');//不带零
echo$base\d;
$today=新日期时间(“现在”);
$d=$today->format('j');
echo$d;
如果($base_d==$d){
返回true;
}否则,如果($base_d>28){
$base_dt->modify(‘本月最后一天’);
$dif_base=$base_dt->format('j')-$base_d;
//echo$dif_基地;
$today->modify(‘本月最后一天’);
$diff_today=$today->format('j')-$d;
//echo$diff_今天;

如果($base_d==31&&$diff_today==0)||($base_d==30&&$diff_today==0&&$dOk,但实际问题是什么?顺便说一句,一个月的最后一天是另一个月的第一天的前一天。对不起,我想我还不够清楚。用户呼吁客户购买产品,并使用他们的用户作为促销代码/推荐号码。这导致用户从一开始就获得佣金他们的加入周年纪念日。即:用户在31日加入,因此他们上个月的佣金将在31日、30日、29日等根据月份计算。因此我试图确定两件事1)佣金应该在今天计算吗?2)根据用户的周年加入日期,用户最后一个月的日期范围是多少?Monkey business的确如此。我只是简单地假设我必须用php完成这项工作,但这要简单得多。非常感谢!