首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >针对员工的SQL加班

针对员工的SQL加班
EN

Stack Overflow用户
提问于 2018-10-11 11:02:08
回答 1查看 39关注 0票数 0

我正在尝试编写一个代码,该代码将允许员工在加班时有另一个事务处理,即使他之前拒绝了加班事务处理。

代码语言:javascript
复制
Employee_1 Shift: 9:00:00-18:00:00   OT Start Time: 18:00:00

场景1示例:

代码语言:javascript
复制
**Employee**: Employee_1    **Time:** 18:00:00-22:00:00    **Status:**  Rejected

**Employee:** Employee_1    **Time:** 18:00:00-20:00:00            
**Status:** (This should be allowed since previous transaction is rejected)

场景2

代码语言:javascript
复制
**Employee:** Employee_1  **Time:**18:00:00-21:00:00   **Status:** Authorized

**Employee:**Employee_1   **Time:** 18:00:00-20:00:00  **[Status:][1]** (Overlapping not allowed) 



if exists(select 'X'   from Employee_OT_TBL tbl (nolock)            
where   tbl.ot_plan_date = @ot_plan_date          
and @ot_from_datetime < tbl.ot_to_datetime
and @ot_todatetime > tbl.ot_from_datetime 
and status = case when tbl.ot_status = 'REJ' then 0 else 1 end
and status = case when ot.doc_status = 'PEND' then 0 else 1 end ) 

员工OT开始时间OT结束时间状态Employee_1 18:00:00 21:00:00授权Employee_1 18:00:00 20:00:00不允许重叠

员工OT开始时间OT结束时间状态Employee_1 18:00:00 21:00:00已拒绝Employee_1 18:00:00 20:00:00进行授权(由于之前的申请已授权,因此允许此操作

EN

回答 1

Stack Overflow用户

发布于 2018-10-11 14:55:21

我最近在SQL for overlapping time periods上工作。

请查看参考文档,详细了解解决方案

我将为您推荐以下SQL代码。

您可以删除包含上一列的CASE语句和OverLapping。

但NewStatus字段用例是必需的。它检查是否发生重叠,然后使用SQL Lag function读取前一个数据行的状态

在UPDATE语句中使用之前,请测试查询

代码语言:javascript
复制
select
 *,
 case when
  (ot_start between (lag(ot_start,1) over (partition by employee order by ot_start)) and (lag(ot_end,1) over (partition by employee order by ot_start))) or
  (ot_end between (lag(ot_start,1) over (partition by employee order by ot_start)) and (lag(ot_end,1) over (partition by employee order by ot_start))) or
  (ot_start < (lag(ot_start,1) over (partition by employee order by ot_start)) and ot_end > (lag(ot_end,1) over (partition by employee order by ot_start))) or
  (ot_start >(lag(ot_start,1) over (partition by employee order by ot_start)) and ot_end < (lag(ot_end,1) over (partition by employee order by ot_start)))
 then 
    'yes'
 when (lag(ot_start,1) over (partition by employee order by ot_start)) is null
 then NULL
 else 'no'
 end as [OverLapping with Previous],

 case when
  (ot_start between (lag(ot_start,1) over (partition by employee order by ot_start)) and (lag(ot_end,1) over (partition by employee order by ot_start))) or
  (ot_end between (lag(ot_start,1) over (partition by employee order by ot_start)) and (lag(ot_end,1) over (partition by employee order by ot_start))) or
  (ot_start < (lag(ot_start,1) over (partition by employee order by ot_start)) and ot_end > (lag(ot_end,1) over (partition by employee order by ot_start))) or
  (ot_start >(lag(ot_start,1) over (partition by employee order by ot_start)) and ot_end < (lag(ot_end,1) over (partition by employee order by ot_start)))
 then 
    case when  (lag([Status],1) over (partition by employee order by ot_start)) = 'Rejected' then 'Approved' else 'Rejected' end
 when (lag(ot_start,1) over (partition by employee order by ot_start)) is null
 then [Status]
 else [Status]
 end as [NewStatus]
from overtime 

我只做了一个有限的测试。以下是输出

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52751529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档