sql-server - 更改 Bool 时 SQL Server 调整计算
问题描述
在 Sql Server 中,我试图添加一个列来根据员工的开始日期计算员工的额外休假,而学徒没有得到任何休假。但我收到一个错误。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);
推荐阅读
- elisp - 符号的函数定义为 void: after-load'
- javascript - 在 cypress 中使用机会插件
- java - 事务性注释会降低 jpa 实现后的性能
- javascript - 如何使用 JSON.parse() 解析多个对象
- angular - Angler 5:将类添加到选中复选框的特定索引 LI
- react-native - 反应原生中的 BoxShadow
- node.js - 无法读取未定义的属性“标题”
- arrays - 我有一个图像列表,图像形状是 (50,50,3) 。如何转换为形状的 numpy.ndarray (19929,50,50,3)
- javascript - 第一个标志淡出,但第二个标志没有淡入......向下滚动。我错过了什么?
- gridview - 冻结网格视图标题 (odoo V12)