簡體   English   中英

日期范圍的存儲過程在單個列中

[英]Stored Procedure for date ranges in a single column

在我的項目中尋找問題的解決方案

我有與合同相關的階段。 也就是說,合同可以處於Active階段, Process階段或Terminated階段。

我需要在每個階段都沒有合同的日子。

例如,如果一個合同C1是在Active階段從20/10/201322/10/2013 ,然后在Process階段從22/10/201325/10/2013最后在Terminated從階段25/10/201326/10/2013 ,然后在Active26/10/201328/10/2013 ,那么我應該得到結果

  • 有效= 4天
  • 流程= 3天
  • 終止= 1天/同樣

我的表是使用以下列創建的:

  • EntryId (主鍵)
  • StageIdStage表的外鍵)
  • ContractIdcontract表的外鍵)
  • DateofStageChange

如何在SQL Server中執行此操作?


根據要求找到表條目:

EntryID | 階段ID | 合約編號| 日期變更

1 | A1 | C1 | 20/10/2013

2 | P1 | C1 | 22/10/2013

3 | T1 | C1 | 25/10/2013

4 | A1 | C1 | 26/10/2013

5 | P1 | C1 | 28/10/2013

6 | T1 | C1 |空(當前處於此階段)


需要在Stage ID上使用分組依據

檢查並確保表中數據的填充方式非常重要。僅基於示例數據,還請注意,如果entryid不在序列中,則可以使用row_number創建一個序列。

declare @t table(EntryId int identity(1,1), StageId int,ContractId varchar(10),DateofStageChange date)
insert into @t values 
(1,'C1','2013-10-20'),(1,'C1','2013-10-22'),(2,'C1','2013-10-22'),(2,'C1','2013-10-25')
,(3,'C1','2013-10-25'),(3,'C1','2013-10-26'),(1,'C1','2013-10-26'),(1,'C1','2013-10-28') 

Select StageId,sum([noOfDays]) [totalNofDays] from 
(select a.StageId,a.ContractId,a.DateofStageChange [Fromdate],b.DateofStageChange [ToDate]  
,datediff(day,a.DateofStageChange,b.DateofStageChange) [noOfDays]
from @t a
inner join @t b on a.StageId=b.StageId and b.EntryId-a.EntryId=1)t4
group by StageId

您無法使用當前的結構。

您可以通過執行datediff(d, getdate(), DateOfStageChange)獲得最新datediff(d, getdate(), DateOfStageChange)

但您沒有任何歷史記錄,因此無法獲得以前的狀態

可以使用CTE在SQL中完成。

您沒有提供表名,因此您需要更改我在下面指出的位置,但是它看起來像這樣:

;WITH cte
AS (
SELECT 
    DateofStageChange, StageID, ContractID,
    ROW_NUMBER() OVER (ORDER BY ContractID, StageId, DateofStageChange) AS RowNum
FROM 
    DateOfStageChangeTable  //<==== Change this table name
)

SELECT 
   a.ContractId,
   a.StageId, 
   Coalesce(sum(DATEDIFF(d ,b.DateofStageChange,a.DateofStageChange)), 'CurrentState`) as Days
FROM 
 cte AS A
LEFT OUTER JOIN
 cte AS B   
 ON A.RowNum = B.RowNum + 1 and a.StageId = b.StageId and a.ContractId = b.ContractId
group by a.StageId, a.ContractId

這實際上只是一個自我聯接,可以在表上創建行號,並按StageID和日期對表進行排序,然后聯接到自身。 階段ID和日期的第一行上的第一個日期與第二行上的第二個日期合並,然后以天為單位計算日期范圍。

假設每個階段只有2個日期,如果有多個日期,則只需要在cte表上進行最小和最大即可。

編輯:

根據您的樣本數據,上述查詢應該可以正常工作。 如果您遇到語法錯誤,請告訴我,我們將對其進行修復。

我添加了一個合並以指示它們當前所處的狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM