You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL查询获取错误数据:无法正确筛选1个月前应支付的PaymentGraph数据

问题分析与修正方案

你的查询条件逻辑完全搞反了,而且计算「一个月前」的方式有误,这才导致筛选出了不符合预期的日期记录。我们一步步拆解问题:

原条件的问题所在

先看你写的核心筛选条件:

date(now()) >= date_sub(PAYMENT_DATE, interval DAY(LAST_DAY(now())) day)

我们拿当前日期是2018-01-04来举例计算:

  1. LAST_DAY(now())得到当前月最后一天:2018-01-31
  2. DAY(LAST_DAY(now()))提取天数:31
  3. date_sub(PAYMENT_DATE, interval 31 day)是把付款日期往前推31天
  4. 最后判断「当前日期 ≥ 付款日期往前推31天」,等价于:
    PAYMENT_DATE <= date_add(date(now()), interval 31 day)
    

这意味着你实际在找**付款日期不晚于「当前日期+31天」**的记录,自然会包含12月10日、17日这些远晚于「一个月前」的日期,完全和你的需求相反。

修正后的查询

如果你要获取付款日期为一个月前及更早的记录,直接用date_sub(now(), interval 1 month)得到一个月前的日期,然后判断付款日期≤这个值即可:

select CONTRACT_ID 
from PaymentGraph 
where PAYMENT_DATE <= date_sub(date(now()), interval 1 month) 
  and state = 'A' 
  and ifnull(paid, 0) < amount

还是用2018-01-04举例,date_sub(date(now()), interval 1 month)会得到2017-12-04,条件就会精准筛选出付款日期≤2017-12-04的记录,完全符合你的需求。

额外说明

如果你担心interval 1 month在特殊日期的表现(比如当前是3月31日,减1个月会变成2月28/29日),也可以用更严谨的写法确保取到上个月的同一天:

PAYMENT_DATE <= date_format(date_sub(now(), interval 1 month), '%Y-%m-%d')

内容的提问来源于stack exchange,提问作者Jack Daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:07:18