gpt4 book ai didi

mysql - 给出错误结果的月份数

转载 作者:行者123 更新时间:2023-11-29 09:07:35 25 4
gpt4 key购买 nike

成员(member)资格

  • membership_startdate
  • member_dueday

要查找成员(member)从 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 |
+----+------------+---------+------------+---------------+

关于mysql - 给出错误结果的月份数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6613738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com