使用CASE计算更改日期差异

时间:2013-01-22 14:58:01

标签: sql sql-update case

在添加到数据库中的最终表之前,我有一个数据保留表。

在该表中是一个日期计算,它返回一个月内的天数。

但是,这是基于项目的,我需要做的是在另一个表中查找项目ID,以查看TimeID(年/月)是否等于项目的开始日期或结束日期

当它匹配时,它需要将该月的天数更改为Month-Start to Project-Finish(如果是结束月份)或Project-Start to Month-End(如果它是开始月份)

我尝试使用以下脚本执行此操作,但我收到错误:

*** This bit is sorted, please see below ***
Msg 156, Level 15, State 1, Line 15
Incorrect syntax near the keyword 'FROM'.
Msg 102, Level 15, State 1, Line 23
Incorrect syntax near 'A'.
*** This bit is sorted, please see below *** 

*编辑* 感谢Anton,我已将所需的END添加到我的CASE语句中,但现在我得到了一组不同的错误(可能是我的语法):

Msg 207, Level 16, State 1, Line 23
Invalid column name 'TimeID'.
Msg 207, Level 16, State 1, Line 20
Invalid column name 'TimeID'.
Msg 207, Level 16, State 1, Line 26
Invalid column name 'ID'.
Msg 207, Level 16, State 1, Line 28
Invalid column name 'ID'.

如果可以,请帮忙。

脚本是:

UPDATE FAC
SET FAC.[SignedData] = 
CASE
    WHEN FAC.[TIMEID] = A.[Start_TimeID] THEN 
        CASE
            WHEN pd.[Start_Date] >= GETDATE() THEN datediff(day,pd.[Start_Date],pt.[Period_End])
            WHEN pd.[Start_Date] < GETDATE() THEN datediff(day,GETDATE(),pt.[Period_End])
        END

    WHEN FAC.[TIMEID] = A.[End_TimeID] THEN 
        CASE
            WHEN pd.[End_Date] >= GETDATE() THEN datediff(day,getdate(),pd.[End_Date])
            WHEN pd.[End_Date] < GETDATE() THEN '0'
        END
    END
FROM Temp_Fac2Programme FAC
JOIN
    (
    SELECT 
        pd.[TimeID], pd.[Start_TimeID], pd.[End_TimeID], pt.[Period_Start], pt.[Period_End]
    FROM ProjectDates pd
    JOIN ProjectTimeID pt
        on pd.[TimeID] = pt.[TimeID]
    ) A

ON A.[ID] = FAC.[Project]

Where   A.[ID] = FAC.[Project]

GO

注意 - SIGNEDDATA是该月的天数。

*示例数据*

Temp_Fac2Programme(FAC)包含:

ACCOUNT             CATEGORY        DATASRC     PROFITCENTRE    PROJECT         RPTCURRENCY     TIMEID          SIGNEDDATA      SOURCE
REMAIN_DAYS_FLAG    ACTUAL          DS_FLAGS    B9059           AAA_7915_BBOY   LC              20130100        34.0000000000   0

ProjectDates(pd)包含:

PROJECT_ID      START_TIMEID    END_TIMEID  START_DATE  END_DATE    TOTAL_DAYS
PAG_5244_CASH   20110400        20120300    2011-04-01  2012-03-31  365

ProjectTimeID(pt)包含:

TIMEID      PERIOD_START    PERIOD_END  DAYS_IN_PERIOD  PCMONTHSTAT
20140600    2014-05-31      2014-06-27  27              F

1 个答案:

答案 0 :(得分:1)

截至当前(已编辑)版本,它基本上是错误消息所说的:

您在两个地方使用pd.[TimeID],但TimeID中没有ProjectDates列(目前我不知道您的意思)。

您的子查询(别名为A)没有ID列。可能的解决方法是将pd.[Project_ID] as ID添加到子查询的所选字段列表中。