入职时间 离职时间
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 行受影响)*/
------解决方案--------------------