0

我有一个包含工作列表的数据库;例如,它可以是简历中以前工作经验的列表。我想知道一个人受雇了多少天;所以,我写了这个查询:

SELECT sum(datediff(dd,isnull(date_begin,getdate()),isnull(date_end,getdate()))+1)
  FROM jobs
 WHERE person_id=X

问题是,有时这些日期会重叠。例子:

person date_from   date_to     Comment
John   01-Jan-2011 31-Dec-2012 Two years working at ABC
John   01-Jan-2012 31-Dec-2013 Two years of extra work at evening

在这种情况下,我的查询将返回 4 年,但我只想返回 3 年。换句话说,如果一个人一年有 2 份工作,我希望它计为 1 年,而不是 2 年。重叠作业可以是任意数字,而不仅仅是 2。我尝试通过减去所有重叠的总持续时间来调整查询,这适用于 2 个重叠作业,但如果有更多重叠作业,这将失败。

4

2 回答 2

2

您可以使用 acte创建日期的驱动程序列表,然后JOIN使用它BETWEEN来获取不同的日期,如果此查询经常运行,则可能值得使用 cte 创建日期查找表并对其进行索引:

;WITH cte AS (SELECT CAST('20100101' AS DATE) 'Dt'
              UNION ALL
              SELECT DATEADD(DAY,1,Dt)
              FROM cte
              WHERE dt <= GETDATE())   
SELECT person,MIN(b.dt),MAX(b.Dt),COUNT(DISTINCT b.dt)'Total Days'
FROM #Table a
JOIN cte b
  ON b.Dt BETWEEN a.date_from AND a.date_to            
GROUP BY person
OPTION (MAXRECURSION 0)   
于 2013-08-30T17:08:57.340 回答
1

我能想到的一种方法是创建一个临时表来保存在开始日期和结束日期之间工作的每一天。然后,您将创建一个游标以遍历员工的每条记录(每个唯一的就业条目)并将所有工作天数添加到临时表(使用函数获取两个日期之间的日期列表的示例)。

将所有工作天数加载到表中后,在列表中选择不同天数。

于 2013-08-30T16:50:47.560 回答