22,209
社区成员
发帖
与我相关
我的任务
分享
SELECT fullname AS 姓名,worked_time AS 入职日期,T.工作年份,
(CASE WHEN 工作年份=0 THEN '0'
WHEN 工作年份>=1 AND 工作年份<6 THEN SUM(3+工作年份-1)
WHEN 工作年份>=6 THEN '7' END) AS 年假,
((CONVERT(VARCHAR(4),GETDATE(),120))+SUBSTRING(worked_time,5,6)) AS 开始日期,
(CONVERT(VARCHAR(4),(CONVERT(VARCHAR(4),GETDATE(),120)+1))+SUBSTRING(worked_time,5,6)) AS 截止日期 FROM
(SELECT fullname,worked_time,DATEDIFF(day,worked_time,GETDATE())/365 AS 工作年份 FROM sys_user WHERE worked_time<>'' AND worked_time IS NOT NULL) T
GROUP BY T.fullname,T.worked_time,工作年份
declare @sys_user table(
UserName varchar(6)
,worked_time datetime
);
declare @OA_Leave table(
UserName varchar(6)
,AppDate datetime
,DaysAmount int
);
insert into @sys_user
select '001', '2007-03-01' union all
select '002', '2008-09-01' union all
select '003', '2011-03-01'
;
insert into @OA_Leave
select '001', '2007-06-01',3 union all
select '001', '2011-06-01',3 union all
select '002', '2010-09-05',3 union all
select '002', '2011-07-05',1 union all
select '003', '2011-06-01',1
;
--先计算工作年数
with sys_user as
(
select UserName,worked_time
,CASE WHEN dateadd(yy,datediff(yy,worked_time,GETDATE()),worked_time)>getdate() then datediff(yy,worked_time,GETDATE())-1
ELSE datediff(yy,worked_time,GETDATE())
END as [工作年数]
from @sys_user
)
--在计算应修年假和当前休假的起始日和截止日
,Normal as
(
SELECT UserName,worked_time,[工作年数]
,CASE WHEN [工作年数] IS NULL THEN 0
ELSE CASE WHEN [工作年数]+3>7 then 7 else [工作年数]+3 END
END as [应休年假]
,dateadd(yy,[工作年数],worked_time) as [本年休假起始日]
,dateadd(yy,[工作年数]+1,worked_time) as [本年休假截止日]
from sys_user
)
--聚合
SELECT a.UserName,a.[应休年假]
,ISNULL(SUM(b.DaysAmount),0) as [已休年假]
,[应休年假]-ISNULL(SUM(b.DaysAmount),0) as [可休年假]
from Normal a LEFT JOIN @OA_Leave b
on a.UserName=b.UserName and b.AppDate between a.[本年休假起始日] and a.[本年休假截止日]
group by a.UserName,a.[应休年假]
order by a.UserName
;
/*
UserName 应休年假 已休年假 可休年假
-------- ----------- -------- -----------
001 7 3 4
002 5 4 1
003 3 1 2
*/