2013-08-30 75 views
0

我有一個包含作業列表的數據庫;例如,它可能是CV中以前工作經歷的列表。 我想知道一個人被僱用多少天;所以,我寫了這個查詢:查找一系列日期間隔的總持續時間

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個重疊的工作很合適,但如果有更多的工作,這將失敗。

+0

雖然解決方案可以是任何語言,但我的計劃是創建一個SQL函數,所以我更喜歡純SQL。 –

+0

你使用哪個sql引擎? MySQL的? SQL Server?僅在sql中可能會很複雜。 – csg

+0

SQL Server 2008 r2 –

回答

2

可以使用cte作出日期的驅動程序列表,然後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) 
1

我能想到的一種方法是創建一個臨時表來保存在開始和結束日期之間工作的每一天。然後,您將創建一個光標來遍歷員工的每條記錄(每個獨特的就業條目)並將所有工作日添加到臨時表(Get a list of dates between two dates using a function的一個示例)。

將表格加載到所有工作日後,選擇列表中不同天數的計數。

相關問題