【问题标题】:Change date difference with CASE calculation使用 CASE 计算更改日期差异
【发布时间】:2013-01-05 20:32:56
【问题描述】:

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

该表中有一个 datediff 计算,它返回一个月中的天数。

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

当它匹配时,它需要将该月的天数更改为 Month-Start 到 Project-Finish(如果它是结束月份)或 Project-Start 到 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,我在 CASE 语句中添加了所需的 END,但现在我得到了一组不同的错误(可能是我的语法):

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

NB - 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

【问题讨论】:

  • 对于你的第一个CASE,没有对应的END(除非我错过了什么)
  • 哦。谢谢安东。它允许它运行,但会给出不同的错误。请参阅上面的编辑。

标签: sql sql-update case


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢安东。原来我是愚蠢/疲倦/懒惰,在放弃之前没有正确处理错误。我最终不得不将第三个表加入查询并重命名几个查找,这似乎已经解决了。干杯。
猜你喜欢
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
相关资源
最近更新 更多