在“无效”列上计算DATEDIFF SQL Server 2008 [重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我有代码根据它们的长度分割几个月的记录,代码目前工作没有问题,但我需要计算这些新记录之间经过多少天,所以我可以得到这样的东西:

id  begdate     enddate     days newbeg      newend      
---------------------------------------------------------
123 03/04/2018  03/05/2018  31   03/04/2018  30/04/2018  
123 03/04/2018  03/05/2018  31   01/04/2018  03/04/2018  

我需要展示什么

id  begdate     enddate     days newbeg      newend      days2
---------------------------------------------------------------
123 03/04/2018  03/05/2018  31   03/04/2018  30/04/2018  28
123 03/04/2018  03/05/2018  31   01/04/2018  03/04/2018   4

在我的代码中,我创建了一个从here取得的CTE来分割行,在最后的选择中我使用DATEDIFF for newbeg和newend但是我得到了Error 207, Level 16, State 1, Procedure xx,因为newbegnewend在桌面上无效

;WITH n(n) AS
 --first select goes here
(
--SECOND SELECT
)
SELECT
    --COLUMNS FROM ORIGINAL TABLE
    --DISP NEW COL
    BEGDATE = f, ENDDATE = t,
    --SPLITTED COL
    NEWBEG = CASE n WHEN 0  THEN f ELSE bp END,
    NEWEND = CASE n WHEN md THEN t ELSE ep END,
    --CALC NEW PERDIODS WHERE I GET Msg 207
    DATEDIFF(dd, NEWBEG, NEWEND) as DAYS2
FROM 
    d 
WHERE 
    md >= n
ORDER BY 
    BEGDATE, NEWBEG;

也许这不是合适的方法,或者我做错了什么,提前感谢任何帮助。

sql sql-server common-table-expression
1个回答
1
投票

只需使用另一个CTE:

WITH n(n) AS (
 --first select goes here
     ),
     d as (
     --SECOND SELECT
     ),
     e as (
SELECT --COLUMNS FROM ORIGINAL TABLE
       --DISP NEW COL
       BEGDATE = f, ENDDATE = t,
    --SPLITTED COL
       NEWBEG = CASE n WHEN 0  THEN f ELSE bp END,
       NEWEND = CASE n WHEN md THEN t ELSE ep END
      FROM d 
      WHERE md >= n
     )
SELECT e.*,
    --CALC NEW PERDIODS WHERE I GET Msg 207
       datediff(day, NEWBEG, NEWEND) as DAYS2
FROM e
ORDER BY BEGDATE, NEWBEG;
© www.soinside.com 2019 - 2024. All rights reserved.