SQL语句---年假判断

  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  剩余年假数

 

posted @ 2015-12-10 08:16  hobe6699  阅读(593)  评论(0)    收藏  举报