количество месяцев, дающих неправильные результаты - PullRequest
0 голосов
/ 07 июля 2011

membership стол

  • membership_startdate
  • 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 месяцев (январь-июнь) (в соответствии с датой 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

1 Ответ

2 голосов
/ 07 июля 2011

ОК, вот решение:

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 |
+----+------------+---------+------------+---------------+
...