2011-07-07 42 views
0

membership數個月出現誤導的結果

  • membership_startdate
  • member_dueday

要找到多少的成員已經從membership_startdate支付到現在支付(月數)和考慮到:

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

...但它w當我們認爲memberToMship_StartDate是2011-07-01和mmebership_dueday是07時給出錯誤的結果結果是06,但它是錯誤的。

如果memberToMship_StartDate爲「2011-01-01」,截止日期爲15,則結果將近6個月(1月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 
+0

@湯姆我已經試過,但它是給錯誤的結果.... – user682417

+2

然後指出這點在原來的問題,並取消接受的答案。不要創建一個新的答案來回答相同的問題。 –

+0

你給的例子不會給7嗎? DATEDIFF將在幾天內返回結果。所以DATEDIFF('2011-07-01','2011-01-01')將是181 – JustDanyul

回答

2

OK,這裏的解決方案:

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; 

這裏的一些測試數據給s如何在邊緣情況:

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

Thanq Bohemian ... – user682417

+0

@Bohemain它給像月圓形圖2或3的月數是否有可能得到確切的月份像2.2和0.9這樣m – user682417

+0

是的,但我不知道你想如何計算它,給我看看這組數據的預期結果。 – Bohemian