RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1601670
Accepted
boogili
boogili
Asked:2024-12-05 03:51:14 +0000 UTC2024-12-05 03:51:14 +0000 UTC 2024-12-05 03:51:14 +0000 UTC

显示每个员工的休假/非休假状态间隔

  • 772

员工表 EMP:EMP_ID - 员工标识符 DATE_FROM - 工作开始日期 DATE_TO - 工作结束日期

EMP_ID  DATE_FROM            DATE_TO
1       01.01.2022           31.12.2022
2       01.01.2022           31.12.2022

VAC 休假表: VAC_ID - 休假标识符 EMP_ID - 员工标识符 DATE_FROM - 休假开始日期 DATE_TO - 休假结束日期

VAC_ID EMP_ID DATE_FROM            DATE_TO
1      2      03.02.2022           10.02.2022
7      2      03.04.2022           10.04.2022

EMP_ID - 员工标识符 VAC_ID - NULL,如果员工在此间隔期间工作/假期标识符,如果他正在休假 DATE_FROM - 间隔的开始日期 DATE_TO - 间隔的结束日期

我无法在 sql 中想出简单的解决方案(只有在 pl/sql 中有效的东西)。

如何显示每个员工的休假/不休假状态间隔?

with employees as (
  select 1 as emp_id, to_date('01.01.2022', 'dd.mm.yyyy') as date_from, to_date('31.12.2022', 'dd.mm.yyyy') as date_to from dual
  union all
  select 2 as emp_id, to_date('01.01.2022', 'dd.mm.yyyy') as date_from, to_date('31.12.2022', 'dd.mm.yyyy') as date_to from dual
)
, vacations as (
  -- первый работник в отпуск не ходил
  -- второй работник был два раза в отпуске в середине периода
  select 1 as vac_id, 2 as emp_id, to_date('03.02.2022', 'dd.mm.yyyy') as date_from, to_date('10.02.2022', 'dd.mm.yyyy') as date_to from dual
  union all
  select 7 as vac_id, 2 as emp_id, to_date('03.04.2022', 'dd.mm.yyyy') as date_from, to_date('10.04.2022', 'dd.mm.yyyy') as date_to from dual
)

你需要这个结果:

EMP_ID VAC_ID DATE_FROM            DATE_TO
1      null   01.01.2022           31.12.2022
2      null   01.01.2022           02.02.2022
2      1      03.02.2022           10.02.2022
2      null   11.02.2022           02.04.2022
2      7      03.04.2022           10.04.2022
2      null   11.04.2022           31.12.2022
sql
  • 1 1 个回答
  • 30 Views

1 个回答

  • Voted
  1. Best Answer
    ValNik
    2024-12-08T02:02:22Z2024-12-08T02:02:22Z

    将一个区间按其中包含的段划分为多个部分的问题。

    主要思想是将假期表的行乘以 2 倍 - 假期本身以及假期之后到下一个假期的时间。如果这是该员工的第一个假期线,请添加另一条线,从他的工作开始到第一个假期。

    看一下例子。示例数据已有所扩展。

    EMP_ID DATE_FROM DATE_TO
    1 22 年 1 月 1 日 22 年 12 月 31 日
    2 22 年 1 月 1 日 22 年 12 月 31 日
    3 22 年 1 月 1 日 22 年 12 月 31 日
    4 22 年 1 月 1 日 22 年 12 月 31 日
    5 22 年 1 月 1 日 22 年 12 月 31 日
    6 22 年 1 月 1 日 22 年 12 月 31 日

    - 第一个员工没有去休假
    - 第二个员工在期间两次休假
    - 第三个员工在假期结束当天辞职(休假并解雇)
    - 第四个员工休假 1 天
    -第五个放假开始工作
    --第六个放假后就去度假

    VAC_ID EMP_ID DATE_FROM DATE_TO
    1 2 22 年 2 月 3 日 22 年 2 月 10 日
    7 2 22 年 4 月 3 日 22 年 4 月 10 日
    8 3 22 年 12 月 3 日 22 年 12 月 31 日
    9 4 22 年 2 月 1 日 22 年 2 月 1 日
    10 5 22 年 1 月 1 日 22 年 1 月 3 日
    11 6 22 年 4 月 1 日 22 年 4 月 3 日
    12 6 22 年 5 月 1 日 22 年 5 月 2 日
    13 6 22 年 5 月 3 日 22 年 5 月 13 日
    14 6 22 年 7 月 3 日 22 年 7 月 10 日
    select EMP_ID, D_FROM, D_TO, VACID, N
    from(
    select e.emp_id,e.date_from edate_from,e.date_to edate_to
      , v.emp_id vemp_id,v.date_from vdate_from,v.date_to vdate_to
      ,v.vac_id
      ,case when n=-1 then e.date_from
            when n=0  then coalesce(v.date_from,e.date_from)
            when n=1  then v.date_to+1
       end d_from
      ,case when n=-1 then v.date_from-1
            when n=0  then coalesce(v.date_to,e.date_to)
            when n=1  then coalesce(v.nextdt-1,e.date_to)
       end d_to
      ,case when n=-1 or n=1 then null else vac_id end vacid
      ,n
    from employees e
    left join (select v.* 
            ,lag(date_from)over(partition by emp_id order by date_from) prevdt
            ,lead(date_from)over(partition by emp_id order by date_from) nextdt
          from vacations v
      )v on v.emp_id=e.emp_id
      and v.date_from between e.date_from and e.date_to
    left join (select -1 n from dual union all select 0 n from dual union all select 1 from dual)nn 
       on (n=0) or (n=1  )
         or(n=-1 and prevdt is null ) 
    )a
    where cast(d_from as date)<=cast(d_to as date)
    order by emp_id,d_from,n
    
    
    EMP_ID D_FROM D_TO VACID 氮
    1 22 年 1 月 1 日 22 年 12 月 31 日 无效的 0
    2 22 年 1 月 1 日 22 年 2 月 2 日 无效的 -1
    2 22 年 2 月 3 日 22 年 2 月 10 日 1 0
    2 22 年 2 月 11 日 22 年 4 月 2 日 无效的 1
    2 22 年 4 月 3 日 22 年 4 月 10 日 7 0
    2 22 年 4 月 11 日 22 年 12 月 31 日 无效的 1
    3 22 年 1 月 1 日 22 年 12 月 2 日 无效的 -1
    3 22 年 12 月 3 日 22 年 12 月 31 日 8 0
    4 22 年 1 月 1 日 22 年 1 月 31 日 无效的 -1
    4 22 年 2 月 1 日 22 年 2 月 1 日 9 0
    4 22 年 2 月 2 日 22 年 12 月 31 日 无效的 1
    5 22 年 1 月 1 日 22 年 1 月 3 日 10 0
    5 22 年 1 月 4 日 22 年 12 月 31 日 无效的 1
    6 22 年 1 月 1 日 22 年 3 月 31 日 无效的 -1
    6 22 年 4 月 1 日 22 年 4 月 3 日 11 0
    6 22 年 4 月 4 日 22 年 4 月 30 日 无效的 1
    6 22 年 5 月 1 日 22 年 5 月 2 日 12 0
    6 22 年 5 月 3 日 22 年 5 月 13 日 13 0
    6 22 年 5 月 14 日 22 年 7 月 2 日 无效的 1
    6 22 年 7 月 3 日 22 年 7 月 10 日 14 0
    6 22 年 7 月 11 日 22 年 12 月 31 日 无效的 1

    小提琴

    • 0

相关问题

  • 通过 OUT 参数从过程结果输出

  • ON 关键字附近的语法错误 - SQL

  • 多表查询中的 Count() 聚合函数

  • 根据时间更改单元格中的日期

  • phpMyAdmin 中的错误 #1064 SQL 查询

  • Qt:包含变量的数据库查询

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5