繁体   English   中英

给出错误结果的月数

[英]number of months giving wrong results

membership

  • 会员开始日期
  • member_dueday

membership_startdate中找出会员到现在已经支付了多少付款(月数)并考虑:

SELECT DATEDIFF(GREATEST(NOW(), memberToMship_DueDay), memberToMship_StartDate) AS diff 
  FROM membertomship 

...但是当我们考虑memberToMship_StartDate是 2011-07-01 而mmebership_dueday是 07 结果是 06 时,它给出了错误的结果,但它是错误的。

如果memberToMship_StartDate是“2011-01-01”并且到期日是 15,那么结果是将近 6 个月(1 月 - 6 月)(根据到期日为每月 15 日)。

我正在使用 mysql

我试过这个

                      SELECT DATE_SUB(DATE_ADD(memberToMship_StartDate,GREATEST(NOW(), memberToMship_DueDay)), INTERVAL memberToMship_DueDay DAY ) AS diff FROM membertomships;

但它给出了错误

                 Error Code: 1064
                         You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GREATEST(NOW(), memberToMship_DueDay)), INTERVAL memberToMship_DueDay DAYS ) AS ' at line 1

好的,这是解决方案:

SELECT
    PERIOD_DIFF(DATE_FORMAT(now(),'%Y%m'), DATE_FORMAT(membership_StartDate,'%Y%m')) -- month difference
    + (DAY(membership_StartDate) < member_dueday) -- +1 if the start date was before the due day
    + (DAY(now()) > member_dueday) -- +1 if "now" is after the due day
    - 1 -- needed due to the way we are calculating our own adjustments for due day
    as payment_count
from membertomships;

以下是一些显示边缘情况的测试数据:

create table membertomships (id int auto_increment primary key, membership_startdate date, member_dueday int);
insert into membertomships values (null, '2011-05-01', 15);
insert into membertomships values (null, '2011-05-30', 15);
insert into membertomships values (null, '2011-05-01', 4);
insert into membertomships values (null, '2011-05-30', 4);
SELECT
    membership_StartDate as start,
    member_dueday as due,
    current_date as today,
    PERIOD_DIFF(DATE_FORMAT(now(),'%Y%m'), DATE_FORMAT(membership_StartDate,'%Y%m')) - 1 + (DAY(membership_StartDate) < member_dueday) + (DAY(now()) > member_dueday) as payment_count
from membertomships;
SELECT id, membership_StartDate as start_date, member_dueday as due_day, current_date as today,
PERIOD_DIFF(DATE_FORMAT(now(),'%Y%m'), DATE_FORMAT(membership_StartDate,'%Y%m')) - 1 + (DAY(membership_StartDate) < member_dueday) + (DAY(now()) > member_dueday) as payment_count
from membertomships;
+----+------------+---------+------------+---------------+
| id | start_date | due_day | today      | payment_count |
+----+------------+---------+------------+---------------+
|  1 | 2011-05-01 |      15 | 2011-07-08 |             2 |
|  2 | 2011-05-30 |      15 | 2011-07-08 |             1 |
|  3 | 2011-05-01 |       4 | 2011-07-08 |             3 |
|  4 | 2011-05-30 |       4 | 2011-07-08 |             2 |
+----+------------+---------+------------+---------------+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM