dpmfur2635 2016-04-06 09:03
浏览 62
已采纳

如何在PHP中计算多个到期日期

Can you suggest me the best solution to use if I want to generate multiple expiration dates in PHP, please? I have something like this:

Name   |  activation_date  |  months
--------------------------------------
Record1    04/05/2016           3
Record2    01/01/2016           6
Record3    12/12/2015           12

For record1, I use the following function,

$expriration_date = date('Y-m-d', strtotime("+{$row['months']} months", strtotime($expriration_date)));

To generate the expiration date starting from the "activation_date" and then I save it into my SQL Database.

The problem is that I would like to generate multiple and periodic expiration dates.

For example, for record1, the expiration dates should be: 04/08/2016, 04/11/2016, 04/02/2016 and so on for 5 years and I would like to do the same for all the records. In five years, Record1 should have 20 expiration dates, Record2 should have 10 expiration dates and so on..

EDIT

Interval times can be 3, 6, 12, 24, 36, 48 and 50 months and I would like to generate periodic expiration dates for 5 years.

How can I do this in PHP?
Moreover, is there a way to notify the most recent expiration dates to the user, then?
I've read about cron-job: this is the only solution?

Thank you for all your support!

  • 写回答

1条回答 默认 最新

  • du77887 2016-04-06 10:41
    关注

    You can use simple for loop

     for ($m = $months; $m <=60 ; $m += $months){
       //add $m to activation_date
       $expriration_date = DateTime::createFromFormat('Y-m-d', $activation_date);
       $expriration_date->add(new DateInterval('P'.$m.'M'));
       //do something with $expriration_date 
     }
    

    You can do this by query, (but you don't post what db engine you use).
    This query works on most popular db engines:

    WITH
      intervals AS 
       ( SELECT 1 AS n, 3 AS m
         UNION ALL SELECT 2 AS n, 3 AS m
         UNION ALL SELECT 3 AS n, 3 AS m
         UNION ALL SELECT 4 AS n, 3 AS m
         UNION ALL SELECT 5 AS n, 3 AS m
         UNION ALL SELECT 6 AS n, 3 AS m
         UNION ALL SELECT 7 AS n, 3 AS m
         UNION ALL SELECT 8 AS n, 3 AS m
         UNION ALL SELECT 9 AS n, 3 AS m
         UNION ALL SELECT 10 AS n, 3 AS m
         UNION ALL SELECT 11 AS n, 3 AS m
         UNION ALL SELECT 12 AS n, 3 AS m
         UNION ALL SELECT 13 AS n, 3 AS m
         UNION ALL SELECT 14 AS n, 3 AS m
         UNION ALL SELECT 15 AS n, 3 AS m
         UNION ALL SELECT 16 AS n, 3 AS m
         UNION ALL SELECT 17 AS n, 3 AS m
         UNION ALL SELECT 18 AS n, 3 AS m
         UNION ALL SELECT 19 AS n, 3 AS m
         UNION ALL SELECT 20 AS n, 3 AS m
         UNION ALL SELECT 1 AS n, 6 AS m
         UNION ALL SELECT 2 AS n, 6 AS m
         UNION ALL SELECT 3 AS n, 6 AS m
         UNION ALL SELECT 4 AS n, 6 AS m
         UNION ALL SELECT 5 AS n, 6 AS m
         UNION ALL SELECT 6 AS n, 6 AS m
         UNION ALL SELECT 7 AS n, 6 AS m
         UNION ALL SELECT 8 AS n, 6 AS m
         UNION ALL SELECT 9 AS n, 6 AS m
         UNION ALL SELECT 10 AS n, 6 AS m
         UNION ALL SELECT 1 AS n, 12 AS m
         UNION ALL SELECT 2 AS n, 12 AS m
         UNION ALL SELECT 3 AS n, 12 AS m
         UNION ALL SELECT 4 AS n, 12 AS m
         UNION ALL SELECT 5 AS n, 12 AS m)
    SELECT name, your_db_func_to_add_month(activation_date, n * m) AS expiration_dates
    FROM something 
    INNER JOIN intervals ON months = m
    WHERE activation_date BETWEEN your_db_func_to_add_month(:testdate, -60) AND :testdate
    

    the :testdate is parameter binded to query,
    your_db_func_to_add_month is for example in mysql:

    DATE_ADD(:testdate, INTERVAL 60 MONTH)
    

    Edit:
    if you define table intervals with data above, then you need only select. For MySQL this query looks like:

    SELECT name, DATE_ADD(activation_date, INTERVAL n * m MONTH) (activation_date, n * m) AS expiration_dates
    FROM something 
    INNER JOIN intervals ON months = m
    WHERE activation_date BETWEEN DATE_ADD(:testdate, - INTERVAL 60 MONTH) AND :testdate
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 关于#python#的问题:自动化测试