1 declare
2 @A date='2014-03-06', ---初始工作日
3 @A1 char(4), ---2、获取开始工作日当年年份
4 @A2 varchar(10), ---1、获取开始工作日当年工作总天数。
5 @A3 char(4),---获取开始工作日当年已工作天数
6 @A4 decimal(9,3), ---3、获取开始工作日开年工作天数/当年天数
7 @B date='2014-03-06', ---4、入职日
8 @B1 char(4), ---获取入职年份
9 @C date, ---转正日
10 @D date='2015-03-09', ---年假计算日
11 @D1 decimal(9,3), ---获取计算日当年工作总天数。
12 @D2 char(4), ---获取计算日当年年份
13 @D3 decimal(9,3), ---获取计算日当年工作天数/当年天数
14 @D4 decimal(9,3), ---获取计算日当年已工作天数
15 @D5 char(4), ---从计算日到年底的工作天数
16 @G char(4), ----获取中间整年份
17 @H char(4), ----年假应有天数
18 @I char(4)=0, ---已休假天数
19 @J decimal(9,3), ---按半天取整年假实有天数
20 @K decimal(9,3), ---剩余年假数
21 @L date, ---工作满一年
22 @L1 char(4), ---工作满一年的年份
23 @X decimal(9,3), ---工作年数
24 @Y char(4), ---当年实际工作天数
25 @Z decimal(9,3) ---年假实有天数
26 -----------------------------------
27 ----获取开始工作日当年年份
28 set @A1=(select DATEPART(YYYY,@A))
29 --select @A1 as 工作日当年年份
30 ---------------------------------------------
31 ---获取开始工作日当年工作天数
32 set @A2=(select DATEDIFF(DAY,@A,CAST(@a1+1 as varchar(10))+'-01-01'))
33 --select @A2 as 开始工作日当年工作天数
34 ---------------------------------
35 ---获取开始工作日当年总天数
36 set @A3=(select DATEDIFF(DAY,@A1,CAST(@a1+1 as varchar(10))+'-01-01'))
37 --select @A3 as 开始工作日当年总天数
38 --------------------------------
39 ---获取开始工作日开年工作天数/当年总天数 @A4=@A2/@A3
40 set @A4=CONVERT(decimal(9,3) ,@A2)/CONVERT(decimal(9,3), @A3)
41 --select @A4 as A4
42 ---------------------------------
43 ---获取入职年份 @B1
44 set @B1=(select datepart(YYYY,@B))
45 --select @B1 AS 入职年份
46 ---------------------------------
47
48 ---转正日 @C
49 set @C=(select DATEADD(MONTH,3,@B))
50 select @C AS 转正日
51 ---------------------------------
52 ---获取计算日当年年份
53 set @D2=(select DATEPART(YYYY,@D))
54 --select @D2 as 计算日当年年份
55 -----------------------------------
56 ---获取计算日当年工作总天数
57 set @D1=(select DATEDIFF(DAY,@D2,CAST(@d2+1 as varchar(10))+'-01-01'))
58 --select @D1
59 ---------------------------------------
60 set @L=(select DATEADD(MONTH,12,@B))
61 select @L AS 工作满一年
62
63 ------------
64 set @L1=(select DATEPART(yyyy,@L))
65 select @L1 as 工作满一年的年份
66 --------------------------------------
67 ---获取计算日当年已工作天数
68 if @L1=@D2 --如果工作满一年的年份=计算日期年份
69 begin
70 set @D4=(select DATEDIFF(DAY,@L,@D)) ---获取从工作满一年到计算日的工作天数
71 end
72 if @L1<>@D2
73 begin
74 set @D4=(select DATEDIFF(DAY,@D2,@D))
75 end
76
77 select @D4 到计算日的工作天数
78 -------------------------------------
79 ---从计算日到年底的天数
80 set @D5=(select DATEDIFF(DAY,@D,Cast(@D2+1 as varchar(10))+'-01-01'))
81 select @D5 as D5
82
83 ---获取每年实际工作天数
84 if @L1=@D2 --如果工作满一年的年份=计算日期年份
85 begin
86 set @Y=(select DATEDIFF(DAY,@L,cast(@d2+1 as varchar(10))+'-01-01')) ---获取从工作满一年到本年结束的工作天数
87 end ---得到本年实际工作天数
88 if @L1<>@d2 ---如果工作满一年的年份<>计算日期年份
89 begin
90 set @Y=(select DATEDIFF(DAY,@D2,CAST(@d2+1 as varchar(10))+'-01-01')) ----获取本年总天数
91 end
92
93 ---select @Y as Y
94 ---------------------------
95 ---获取计算日当年工作天数/当年总天数 @D3
96 set @D3=CONVERT(decimal(9,3),@D4)/CONVERT(decimal(9,3),@D1)
97 --select @D3 AS D3
98 -----------------------------
99 ----获取中间整年份 @G
100 set @G=(select DATEDIFF(YEAR,CAST(@A1+1 as varchar(10)),@D2))
101 --select @G AS G
102 ------------------------------
103 ----计算工作年数 @X
104 set @X=@A4+@G+@D3
105 select @X as 工作年数
106 ---------------------------
107 ---年假应有天数 @H
108 if @X<1
109 begin
110 set @H=0
111 end
112 if @X>1 OR @X=1 and @X<10
113 begin
114 set @H=5
115 end
116 if @X>10 or @X =10 and @X <20
117 begin
118 set @H=10
119 end
120 if @X>20 or @X=20
121 begin
122 set @H=15
123 end
124 select @H as 年假应有天数
125 ------------------------------------------
126 ---年假实有天数
127 set @Z=CONVERT(decimal(9,3),@H)/CONVERT(decimal(9,3),@D1)*CONVERT(decimal(9,3),@Y)
128 select @Z as 实有天数
129
130 ----------------------------
131 ---按半天取整年假实有天数
132 ---每天工作8小时,将天数*8 得出小时数/4(半天),得出半天数,用floor向下取整,再/2
133 set @J=floor(CONVERT(decimal(9,3),@Z)*8/4)/2
134 select @J as 按半天取整年假实有天数
135
136 -----------------------
137 ---请假后剩余年假数=实际年假天数-已请年假天数
138 set @K=@J-@I
139 select @K AS 剩余年假数