MySQL查询获取错误数据:无法正确筛选1个月前应支付的PaymentGraph数据
问题分析与修正方案
你的查询条件逻辑完全搞反了,而且计算「一个月前」的方式有误,这才导致筛选出了不符合预期的日期记录。我们一步步拆解问题:
原条件的问题所在
先看你写的核心筛选条件:
date(now()) >= date_sub(PAYMENT_DATE, interval DAY(LAST_DAY(now())) day)
我们拿当前日期是2018-01-04来举例计算:
LAST_DAY(now())得到当前月最后一天:2018-01-31DAY(LAST_DAY(now()))提取天数:31date_sub(PAYMENT_DATE, interval 31 day)是把付款日期往前推31天- 最后判断「当前日期 ≥ 付款日期往前推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
相关产品推荐
相关产品推荐

