首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何计算特殊情况下的工作经验

如何计算特殊情况下的工作经验
EN

Stack Overflow用户
提问于 2019-03-26 06:32:34
回答 4查看 71关注 0票数 0

我在试着计算经验的年数

假设某人有多个工作,如下所示:

代码语言:javascript
运行
复制
startdate       enddate
2007-08-27      2008-05-09 
2007-08-27      2008-05-09  
2012-01-01      2018-07-31 
2013-01-06      2019-03-25

如果只选择startdate,enddate,然后插入一个函数来计算每个雇佣的天数,正确的sql语法是什么?

以下是我的预期结果:

代码语言:javascript
运行
复制
1st row: startdate 8/27/2007, enddate 5/9/2008 
2nd row: startdate 1/1/2012, enddate 3/25/2019 

第二次就业发生在第一次就业的同一时间,因此不会计入。第四次就业是在第三次就业结束之前开始的,所以我们应该使用第三次就业的开始日期和第四次就业的结束日期。

EN

回答 4

Stack Overflow用户

发布于 2019-03-26 07:13:02

使用Distinct删除复制的记录。然后,您可以使用以下查询:

代码语言:javascript
运行
复制
Select totaldays / 365 from 
(Select Sum(
    DATEDIFF(day, srartdate, enddate )
    ) As totaldays
 ) 
票数 0
EN

Stack Overflow用户

发布于 2019-03-26 07:35:19

此查询返回没有重叠的日期:

代码语言:javascript
运行
复制
select 
  v.startdate startdate,
  min(vv.enddate) enddate
from view_appemployment v 
inner join view_appemployment vv 
on v.startdate <= vv.enddate
and not exists (
  select * from view_appemployment vvv 
  where vv.enddate >= vvv.startdate and vv.enddate < vvv.enddate
) 
where not exists (
  select * from view_appemployment vvvv 
  where v.startdate > vvvv.startdate and v.startdate <= vvvv.enddate
) 
group by v.startdate

请参阅demo

结果:

代码语言:javascript
运行
复制
startdate           | enddate            
 ------------------ | ------------------
27/08/2007 00:00:00 | 09/05/2008 00:00:00
01/01/2012 00:00:00 | 25/03/2019 00:00:00
票数 0
EN

Stack Overflow用户

发布于 2019-07-03 20:29:32

这是一个序列中的间隙和岛屿问题,下面的查询应该执行您想要的操作:

代码语言:javascript
运行
复制
CREATE TABLE #emp (empid int, startdate date,enddate date)
INSERT INTO #emp VALUES
(1,'2007-08-27','2008-05-09'),
(1,'2007-08-27','2008-05-09'),
(1,'2012-01-01','2018-07-31'),
(1,'2013-01-06','2019-03-25')

;WITH starts AS (
    SELECT em.*,
            (CASE WHEN EXISTS (SELECT 1
                            FROM #emp em2
                            WHERE em2.EmpID = em.EmpID AND
                                    em2.StartDate < em.StartDate AND
                                    em2.EndDate >= em.StartDate
                            ) THEN 0 ELSE 1 END) AS [IsStart]
    FROM #emp em )

SELECT EmpID
    ,MIN(StartDate) AS [StartDate]
    ,MAX(EndDate) AS [EndDate]
FROM (SELECT s.*, SUM(isstart) OVER (PARTITION BY EmpID ORDER BY StartDate) AS [grp]
      FROM starts s
     ) s
GROUP BY EmpID, grp
ORDER BY EmpID
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55347342

复制
相关文章

相似问题

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