2013-06-20 102 views
0

我一直在努力,但我並不擅長tsql。DATEDIFF在日期

這就是我得到的,我不能讓DateTime計算好。我得到A和B之間的總和,但不是總和。例如在最後一列中,我有一個0讓我回到-x。

下面是該過程,以及一些數據是這樣的:

Code_Procedure date_evenement     codes_situation   
--------------------------------------------------------------- 
000079500000 2013-05-21 13:07:00.000  COMCFM    
000079500000 2013-05-21 20:24:00.000  PCHCFM  
000079500000 2013-05-22 09:58:00.000  PCHCFM       
000079500000 2013-05-23 00:00:00.000  AARCFM       
000079500000 2013-05-23 00:00:00.000  LIVCFM     
000079600000 2013-05-21 13:07:00.000  COMCFM    
000079600000 2013-05-21 20:24:00.000  PCHCFM    
000079600000 2013-05-22 11:18:00.000  PCHCFM    
000079600000 2013-05-23 00:00:00.000  AARCFM     
000079600000 2013-05-23 00:00:00.000  LIVCFM    

這裏是PROC:

DECLARE @COMCFM TABLE(numero_colis VARCHAR(25), date_evenement DATETIME); 
INSERT @COMCFM SELECT TOP(5) numero_colis, date_evenement FROM cartitem_colis_postaux_etats WHERE (code_situation = 'PCH' AND code_justification = 'CFM') 

WHILE (SELECT COUNT(*) FROM @COMCFM) > 0 
BEGIN 
    DECLARE @Colis TABLE(numero_colis VARCHAR(25), date_evenement DATETIME, code_situation_code_justification NVARCHAR(32)); 
    INSERT @Colis SELECT numero_colis, date_evenement, code_situation + code_justification FROM cartitem_colis_postaux_etats WHERE numero_colis = (SELECT TOP(1) numero_colis FROM @COMCFM) ORDER BY numero_colis, date_evenement 

    ;WITH CTE AS 
    (
     Select DISTINCT 
     * 
     ,ROW_NUMBER() OVER(PARTITION BY numero_colis ORDER BY date_evenement ASC) Rn FROM @Colis 
    ),CTE1 AS 
    (
     SELECT DISTINCT 
      A.* 
      ,DATEDIFF(mi, B.date_evenement, A.date_evenement) AS DIFF 
     FROM CTE A INNER JOIN CTE B On B.Rn + 1 = A.Rn 
     UNION All 
     SELECT A.*, 0 FROM CTE A Where Rn = 1 
    ) 

    SELECT 
     A.* 
     ,ISNULL((
      SELECT 
       A.DIFF + B.DIFF 
      FROM CTE1 AS B 
      WHERE A.numero_colis = B.numero_colis 
      AND A.Rn = B.Rn + 1), 0) AS Sums 
    FROM CTE1 AS a 
    ORDER BY numero_colis, Rn ASC 

    DELETE FROM @Colis 
    DELETE FROM @COMCFM WHERE numero_colis = (SELECT TOP(1) numero_colis FROM @COMCFM) 
END 

回答

0

我真的不知道你想達到的目標。你需要日期差異作爲累計值嗎?如果你需要這個,有了這個代碼

BEGIN 
    DECLARE @Colis TABLE(numero_colis VARCHAR(25), date_evenement DATETIME, code_situation_code_justification NVARCHAR(32)); 
    INSERT @Colis SELECT numero_colis, date_evenement, code_situation + code_justification FROM cartitem_colis_postaux_etats WHERE numero_colis = (SELECT TOP(1) numero_colis FROM @COMCFM) ORDER BY numero_colis, date_evenement 

    ;WITH CTE AS 
    (
     SELECT DISTINCT 
      *, 
      ROW_NUMBER() OVER(PARTITION BY numero_colis ORDER BY date_evenement ASC) Rn 
     FROM @Colis 
    ),CTE1 AS 
    (
     SELECT A.*, 0 AS CummulatedDiff 
     FROM CTE A 
     WHERE Rn = 1 

     UNION ALL 

     SELECT DISTINCT A.*, B.CummulatedDiff + DATEDIFF(mi, B.date_evenement, A.date_evenement) AS CummulatedDiff 
     FROM CTE AS A INNER JOIN 
      CTE1 AS B ON B.Rn + 1 = A.Rn AND B.numero_colis = A.numero_colis 
    ) 

    SELECT * 
    FROM CTE1 AS a 
    ORDER BY numero_colis, Rn ASC 

    DELETE FROM @Colis 
    DELETE FROM @COMCFM WHERE numero_colis = (SELECT TOP(1) numero_colis FROM @COMCFM) 
END 

我希望這進一步把你帶到你的目標改變你的存儲過程中爲BEGIN-END塊。

+0

感謝隊友,這似乎正是我想要的。 –