当前位置: 代码迷 >> Sql Server >> 员工工龄统计,该怎么解决
  详细解决方案

员工工龄统计,该怎么解决

热度:55   发布时间:2016-04-27 12:58:51.0
员工工龄统计
入职时间 离职时间  
2010-1-2 null
2011-1-2 null
2012-2-2 null
2012-2-1 2012-3-3
要求统计在职员工工具分别 1年及以下 2到3年 3年以上

------解决方案--------------------
SQL code
IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE name = 'tba')BEGIN    DROP TABLE tbaENDGOCREATE TABLE tba(    姓名 VARCHAR(10),    入职时间 VARCHAR(10),    离职时间 VARCHAR(10))GOINSERT INTO tba SELECT '张三','2010-1-2',null UNIONSELECT '李四','2011-1-2',null UNIONSELECT '王五','2012-2-2',null UNIONSELECT '赵六','2012-2-1','2012-3-3'SELECT A.姓名,CASE WHEN DATEDIFF(MONTH,A.入职时间,CASE WHEN A.离职时间 IS NULL THEN GETDATE()                                                       ELSE A.离职时间 END) / 12 < 1 THEN '1年及以下'                   WHEN DATEDIFF(MONTH,A.入职时间,CASE WHEN A.离职时间 IS NULL THEN GETDATE()                                                       ELSE A.离职时间 END) / 12 < 3 THEN '2年到3年'                   WHEN DATEDIFF(MONTH,A.入职时间,CASE WHEN A.离职时间 IS NULL THEN GETDATE()                                                       ELSE A.离职时间 END) / 12 >= 3 THEN '3年以上' END AS 工龄FROM tba AS AORDER BY 工龄姓名    工龄王五    1年及以下赵六    1年及以下李四    2年到3年张三    2年到3年
------解决方案--------------------
SQL code
--> 测试数据:[tb]if object_id('[tb]') is not null drop table [tb]go create table [tb]([入职时间] datetime,[离职时间] datetime)insert [tb]select '2010-1-2',null union allselect '2011-1-2',null union allselect '2012-2-2',null union allselect '2012-2-1','2012-3-3'--------------开始查询--------------------------select sum(case when datediff(yy,[入职时间],isnull([离职时间],getdate()))<1 then 1 else 0 end) [1年及以下], sum(case when datediff(yy,[入职时间],isnull([离职时间],getdate()))>=1 and datediff(yy,[入职时间],isnull([离职时间],getdate()))<2 then 1 else 0 end)[1到2年], sum(case when datediff(yy,[入职时间],isnull([离职时间],getdate()))>=2 and datediff(yy,[入职时间],isnull([离职时间],getdate()))<3 then 1 else 0 end)[2到3年], sum(case when datediff(yy,[入职时间],isnull([离职时间],getdate()))>3 then 1 else 0 end)[3年以上] from [tb]----------------结果----------------------------/* 1年及以下       1到2年        2到3年        3年以上----------- ----------- ----------- -----------2           1           1           0(1 行受影响)*/
------解决方案--------------------
SQL code
CREATE TABLE tba(    姓名 VARCHAR(10),    入职时间 VARCHAR(10),    离职时间 VARCHAR(10))GOINSERT INTO tba SELECT '张三','2010-1-2',null UNIONSELECT '李四','2011-1-2',null UNIONSELECT '王五','2012-2-2',null UNIONSELECT '赵六','2012-2-1','2012-3-3'SELECT DATEDIFF(YEAR,'2011-2-1','2012-3-3')SELECT tbA.姓名,tbA.入职时间 ,CASE  WHEN DATEDIFF(YEAR,入职时间,ISNULL( 离职时间,getdate()))=0 THEN '一年以内'  WHEN DATEDIFF(YEAR,入职时间, ISNULL( 离职时间,getdate()))>0 and DATEDIFF(YEAR,入职时间, ISNULL( 离职时间,getdate()))<2 then '二年到三年之内' WHEN DATEDIFF(YEAR,入职时间,ISNULL( 离职时间,getdate()))>2 then '三年以上'ELSE '' END  AS 入职日期年限 FROM TBA order BY 入职时间 desc/*姓名         入职时间       入职日期年限---------- ---------- --------王五         2012-2-2   一年以内赵六         2012-2-1   一年以内李四         2011-1-2   二年到三年之内张三         2010-1-2   (4 行受影响)*/
------解决方案--------------------
探讨

6楼的不准确 我要精确到天,如果以一年365天来计算,但存在是否是润年的问题
  相关解决方案