SQL Server Корректировка расчетов при изменении Bool - PullRequest
0 голосов
/ 11 февраля 2019

В 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 

)  

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Ваш код в порядке, но вы пропустили 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 
)  
0 голосов
/ 11 февраля 2019

Хорошее использование пробелов и разрывов строк действительно важно, я настоятельно рекомендую использовать оба, чтобы сделать ваш код читабельным (не только для других, но и для вас самих), и, следовательно, проще для отладки.Если вы отформатируете свой код, то причина станет гораздо более очевидной:

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);
...