SQL Server
-- 我用了JobID来判断女性原来属于55还是50岁退休(即管理和非管理岗)
WITH
-- 原始退休日期
ORIGINALINFO AS (
SELECT EMPLOYEEID, IIF(GENDER = 'Male', 60, IIF(JOBID <= 8, 55, 50)) AS ORAGE, --原退休年龄(用职位判断女性是干部/非干部)
DATEADD(DAY, 1, DATEADD(YEAR, IIF(GENDER = 'Male', 60, IIF(JOBID <= 8, 55, 50)), BIRTHDAY)) AS ORDATE, --原退休日期
IIF(GENDER = 'Male', 3, IIF(JOBID <= 8, 3, 5)) * 60 AS MAXDELAY, -- 最大延迟约束
IIF(GENDER = 'Male', 4.0, IIF(JOBID <= 8, 4.0, 2.0)) AS DELAYRULE, -- 延迟规则
CEILING(DATEDIFF(MONTH, '2025-01-01', DATEADD(YEAR, IIF(GENDER = 'Male', 60, IIF(JOBID <= 8, 55, 50)), BIRTHDAY)) /
IIF(GENDER = 'Male', 4.0, IIF(JOBID <= 8, 4.0, 2.0))) AS DELAYAMOUNT
FROM [YOUR_EMPLOYEE_TABLE]
),
DELAYMONTH AS (
SELECT A.EMPLOYEEID, IIF(B.DELAYAMOUNT < 0, 0, IIF(B.DELAYAMOUNT > B.MAXDELAY, B.MAXDELAY, B.DELAYAMOUNT)) AS DELAYMONTHS
FROM [YOUR_EMPLOYEE_TABLE] A
INNER JOIN ORIGINALINFO B ON A.EMPLOYEEID= B.EMPLOYEEID
)
SELECT A.NAME, A.GENDER, A.BIRTHDAY, B.ORAGE, B.ORDATE, B.DELAYRULE, B.DELAYAMOUNT,
DATEADD(DAY, 1, DATEADD(MONTH, B.ORAGE * 12 + C.DELAYMONTHS, A.BIRTHDAY)) AS RETIREMENTDATE
FROM [YOUR_EMPLOYEE_TABLE] A
INNER JOIN ORIGINALINFO B ON A.EMPLOYEEID= B.EMPLOYEEID
INNER JOIN DELAYMONTH C ON A.EMPLOYEEID= C.EMPLOYEEID
评论