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
)
在 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
)