weiainull 2022-02-16 11:34 采纳率: 100%
浏览 57
已结题

sql,给一个start时间和end时间,其中有m个断点时间,要踢出这m个月的时间,最后返回m+1条数据把区间返回

我有一个表记录了某人id, ,start_date 和end_date 日期,另一个表记录了对应的id人,date 未出席的当月的月末日期,比如1月31日,如果2个月没出席,就有2条数据,我想等得到这个人出席对的时间段,返回要求是一段区间是一行记录,返回 id,区间1-区间2,有3个月没出席的话,返回4条区间,前提是数据配置都正常的情况下
难点在于每个人都未出席的月份时,都会返回m个月+1的数据,以及需要考虑有的人没缺席,缺席一个月,缺席多个月的情况,不能用存储过程
源数据
         表a,  id, start_date, end_date
         表b, id, monthend_date

表a id start_date end_date
1 2021-01-01 2021-12-15
2 2021-01-01 2021-12-15
3 2021-01-01 2021-12-15

表b id monthend_date
1 2021-03-31
2 2021-03-31
2 2021-05-31
备注 这个表的monthend_date 只会出现月末的最后一天日期,来代表这个月都是未出席的

我想要达到的结果

返回
id qujian1 qujian2
1 2021-01-01 2021-02-28
1 2021-04-01 2021-12-15
2 2021-01-01 2021-02-28
2 2021-04-01 2021-04-30
2 2021-06-01 2021-12-15
3 2021-01-01 2021-12-15

  • 写回答

2条回答 默认 最新

  • DarkAthena ORACLE应用及数据库设计方案咨询师 2022-02-16 18:27
    关注

    用的是什么数据库?


    --测试数据
    create table test_a_20220218 (id int,start_date datetime,end_date datetime);
    insert into test_a_20220218 values (1,'2021-01-01','2021-12-15');
    insert into test_a_20220218 values (2,'2021-01-01','2021-12-15');
    insert into test_a_20220218 values (3,'2021-01-01','2021-12-15');
    
    create table test_b_20220218(id int,monthend_date datetime);
    insert into test_b_20220218 values(1,'2021-03-31');
    insert into test_b_20220218 values(2,'2021-03-31');
    insert into test_b_20220218 values(2,'2021-05-31');
    
    --查询sql (mysql 8.0 以上,sqlserver去掉RECURSIVE,修改日期计算函数也可以)
    with RECURSIVE cte as(
    select id,start_date , end_date from test_a_20220218 a
    union all
    select cte.id,DATE_SUB(cte.start_date,INTERVAL -1 DAY),cte.end_date  from cte where DATE_SUB(cte.start_date,INTERVAL -1 DAY)<=cte.end_date
    ),
    t as (
    select cte.id,cte.start_date,
    date_sub(cte.start_date, interval (rank() over(partition by id order by cte.start_date)) day) gp
    from cte where not exists (select 1 from test_b_20220218 b where b.id=cte.id and month(cte.start_date)=month(b.monthend_date))
    )
    select id,min(start_date),max(start_date) from t group by id,gp
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月26日
  • 已采纳回答 2月18日
  • 修改了问题 2月16日
  • 创建了问题 2月16日

悬赏问题

  • ¥15 winform的chart曲线生成时有凸起
  • ¥15 msix packaging tool打包问题
  • ¥15 finalshell节点的搭建代码和那个端口代码教程
  • ¥15 用hfss做微带贴片阵列天线的时候分析设置有问题
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 海浪数据 南海地区海况数据,波浪数据
  • ¥20 软件测试决策法疑问求解答