oracle如何找没有缴费的记录

新手上路,请多包涵

老哥们帮帮忙啊。我现在有个字段叫缴费记录,然后现在要找出缴费记录中断的时间,比如说201803到202003这个区间,某个人他可能201807,201903没有缴费,怎么找出这个时间。而且他如果没有缴费是没有记录的。。最后我要把这个欠缴费的时间拼上他个人的信息显示,怎么做,用oracle。而且某个人缴费可能不是在这个区间开始的,比如不是在201803开始,而是他在201805才开始缴费的。

阅读 2.2k
3 个回答

没有试过,但是有个想法,创建一张表,记录是从197001开始到210001(或者更大),然后关联查询,把匹配不到缴费记录的查出来就可以了

20210410补充

也不知道是谁把我的答案踩了。。。那我就说清楚一点吧

举个例子,有一张缴费的记录表:

create table payment_record (
    record_id LONG NOT NULL AUTO_INCREMENT PRIMARY KEY,
    month INT(10) UNSIGNED NOT NULL,
    user_id LONG NOT NULL
);

假设202001-202012用户1已缴费的月份为1、3、4、5月,那怎么找出没缴费的月份呢?我们创建一张关联表,仅保存月份数据:

create table payment_month (
    month INT(10) UNSIGNED NOT NULL
);

向其中写入数据:

-- 写入197001-220001的月份信息
insert into payment_month values (197001), (197002), ...(220001);

然后,关联两张表,就可以找到用户1没有缴费的月份了:

select t1.month
from payment_month t1
where t1.month >= 202001 and t1.month <= 202012
  and not exists (select 1 from payment_record t2 where t2.user_id=1 and t1.month = t2.month);

我对sql语言并不很熟悉,所以具体实现可能没法给你一个直接可用的答案,但是可以提供一个思路:

  1. 首先你得找到这个人最早一次缴费记录的日期,这个日期之后如果没有记录才是缴费中断,这个日期之前这个人一次都没交过费。(这个是我的假设啊,不知道你的业务场景里是不是这样的)。
  2. 上面的日期是你要查找的区间的上限,然后就是确定你要查找的区间的下限。
  3. 把这个区间之间的所有月份列出来,当然不是硬编码哈,还是写sql生成个集合之类的,然后把所有缴费记录的日期和这个日期集合对比,做一次筛选。
  4. 你最后要返回的是你生成的日期集合中没有被数据库记录匹配到的。

sql语法和函数我不那么熟悉,不过估计是要用到好几层子循环,一层查这个最早的日期,然后把最早的日期作为条件,结合最晚的日期组成区间,生成这个区间的日期,再select全表找匹配不到的日期,就应该可以得到最后结果啦。
感觉挺有意思的,如果写出来了也告诉我一下吧,我好学习学习。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题