SQL服务器在Bool改变时调整计算

SQL Server Adjusting calculation when Bool is changed

在 Sql 服务器中,我试图添加一个列来根据员工的开始日期计算员工的额外假期,而学徒则没有。但是我收到一个错误。 Incorrect syntax near the keyword 'AS'

还有一种方法可以在 Apprentice 设置为 False 后开始计算额外的假期。

ALTER TABLE [dbo].[Employee]
ADD AwardedLeave as CAST 
(


CASE
When [Apprentice] = 'True'Then 0
When [Apprentice] = 'False' Then 
CASE 

WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate]),01,01) AND 
DATEFROMPARTS(YEAR([StartDate])+1,12,31)  THEN 0
WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate])+2,01,01) AND 
DATEFROMPARTS(YEAR([StartDate])+2,12,31) THEN 8
WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate])+3,01,01) AND 
DATEFROMPARTS(YEAR([StartDate])+3,12,31) THEN 16
WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate])+4,01,01) AND 
DATEFROMPARTS(YEAR([StartDate])+4,12,31) THEN 24 
WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate])+5,01,01) AND 
DATEFROMPARTS(YEAR([StartDate])+5,12,31) THEN 32
WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate])+6,01,01) AND 
DATEFROMPARTS(YEAR([StartDate])+1000,12,31) THEN 40 

END 

+

CASE 
WHEN DATEFROMPARTS(YEAR(StartDate), 12,31) >= GETDATE() THEN datediff(day, 
[StartDate],datefromparts(datepart(year,[StartDate]),(12), 
(31)))/(30.42)*13.33
ELSE [ALCategory]
END AS int 

)  

善用空格和换行符非常重要,我强烈建议同时使用这两种代码以使您的代码可读(不仅对其他人而且对您自己),从而更易于调试。如果你格式化你的代码,那么原因就变得更加明显:

ALTER TABLE [dbo].[Employee]
ADD AwardedLeave AS CAST (CASE WHEN [Apprentice] = 'True'THEN 0
                                WHEN [Apprentice] = 'False' THEN CASE WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate]),01,01) AND DATEFROMPARTS(YEAR([StartDate])+1,12,31)  THEN 0
                                                                        WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate])+2,01,01) AND DATEFROMPARTS(YEAR([StartDate])+2,12,31) THEN 8
                                                                        WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate])+3,01,01) AND DATEFROMPARTS(YEAR([StartDate])+3,12,31) THEN 16
                                                                        WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate])+4,01,01) AND DATEFROMPARTS(YEAR([StartDate])+4,12,31) THEN 24 
                                                                        WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate])+5,01,01) AND DATEFROMPARTS(YEAR([StartDate])+5,12,31) THEN 32
                                                                        WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate])+6,01,01) AND DATEFROMPARTS(YEAR([StartDate])+1000,12,31) THEN 40 
                                                                END +
                                                                CASE WHEN DATEFROMPARTS(YEAR(StartDate), 12,31) >= GETDATE() THEN DATEDIFF(DAY, [StartDate],DATEFROMPARTS(DATEPART(YEAR,[StartDate]),(12), (31)))/(30.42)*13.33
                                                                        ELSE [ALCategory]
                                                                END AS int);

注意,您的第一个 CASE 表达式没有 END;因此 AS 处的错误(关键字 END 是预期的):

ALTER TABLE [dbo].[Employee]
ADD AwardedLeave AS CAST (CASE WHEN [Apprentice] = 'True'THEN 0
                               WHEN [Apprentice] = 'False' THEN CASE WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate]),01,01) AND DATEFROMPARTS(YEAR([StartDate])+1,12,31)  THEN 0
                                                                     WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate])+2,01,01) AND DATEFROMPARTS(YEAR([StartDate])+2,12,31) THEN 8
                                                                     WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate])+3,01,01) AND DATEFROMPARTS(YEAR([StartDate])+3,12,31) THEN 16
                                                                     WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate])+4,01,01) AND DATEFROMPARTS(YEAR([StartDate])+4,12,31) THEN 24 
                                                                     WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate])+5,01,01) AND DATEFROMPARTS(YEAR([StartDate])+5,12,31) THEN 32
                                                                     WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate])+6,01,01) AND DATEFROMPARTS(YEAR([StartDate])+1000,12,31) THEN 40 
                                                                END +
                                                                CASE WHEN DATEFROMPARTS(YEAR(StartDate), 12,31) >= GETDATE() THEN DATEDIFF(DAY, [StartDate],DATEFROMPARTS(DATEPART(YEAR,[StartDate]),(12), (31)))/(30.42)*13.33
                                                                     ELSE [ALCategory]
                                                                END
                          END AS int);

你的代码没问题,但是你错过了 END 以防万一,请看下面的代码。

ALTER TABLE [dbo].[Employee]
ADD AwardedLeave as CAST 
(
CASE
When [Apprentice] = 'True'Then 0
When [Apprentice] = 'False' Then 
                                CASE 
                                WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate]),01,01) AND 
                                DATEFROMPARTS(YEAR([StartDate])+1,12,31)  THEN 0
                                WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate])+2,01,01) AND 
                                DATEFROMPARTS(YEAR([StartDate])+2,12,31) THEN 8
                                WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate])+3,01,01) AND 
                                DATEFROMPARTS(YEAR([StartDate])+3,12,31) THEN 16
                                WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate])+4,01,01) AND 
                                DATEFROMPARTS(YEAR([StartDate])+4,12,31) THEN 24 
                                WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate])+5,01,01) AND 
                                DATEFROMPARTS(YEAR([StartDate])+5,12,31) THEN 32
                                WHEN GETDATE() BETWEEN DATEFROMPARTS(YEAR([StartDate])+6,01,01) AND 
                                DATEFROMPARTS(YEAR([StartDate])+1000,12,31) THEN 40 
                                END 
                                +
                                CASE 
                                WHEN DATEFROMPARTS(YEAR(StartDate), 12,31) >= GETDATE() THEN datediff(day, 
                                [StartDate],datefromparts(datepart(year,[StartDate]),(12), 
                                (31)))/(30.42)*13.33
                                ELSE [ALCategory]
                                END 
END
AS int 
)