MySQL查询距当前系统日期3个月后会员卡到期客户的方法
错误排查
你之前写的SQL存在两处明显问题:
- 语法错误:
WHERE c.CardExpDate now()缺少比较运算符,属于无效语法 - 逻辑错误:
datediff(now(),c.CardExpDate) <= -2仅筛选了到期日晚于当前2天以上的客户,和3个月到期的筛选要求完全不符
正确查询方案
方案1:自然月匹配(适配你给出的示例场景)
如果要求到期日落在当前日期加3个月的自然月内(如当前为9月,就筛选所有12月到期的客户),使用以下语句:
SELECT DISTINCT c.customername FROM customers c WHERE YEAR(c.CardExpDate) = YEAR(DATE_ADD(CURDATE(), INTERVAL 3 MONTH)) AND MONTH(c.CardExpDate) = MONTH(DATE_ADD(CURDATE(), INTERVAL 3 MONTH)) ORDER BY c.customerID;
该逻辑完全不使用硬编码日期,你给出的示例中当前日期为2021-09-30时,会筛选所有2021年12月到期的客户,仅返回客户1,和示例要求完全一致。
方案2:精确时间间隔匹配
如果要求到期日和当前日期间隔恰好为3个月(即到期日等于当前日期加3个月的当天),使用以下语句:
SELECT DISTINCT c.customername FROM customers c WHERE c.CardExpDate = DATE_ADD(CURDATE(), INTERVAL 3 MONTH) ORDER BY c.customerID;
如果是要筛选未来3个月内即将到期的所有客户,调整条件即可:
SELECT DISTINCT c.customername FROM customers c WHERE c.CardExpDate BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 MONTH) ORDER BY c.customerID;
内容的提问来源于stack exchange,提问作者S6277
相关产品推荐
相关产品推荐

