日期:2014-05-18  浏览次数:20694 次

员工工龄统计
入职时间 离职时间  
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 tba
END
GO
CREATE TABLE tba
(
    姓名 VARCHAR(10),
    入职时间 VARCHAR(10),
    离职时间 VARCHAR(10)
)
GO
INSERT INTO tba 
SELECT '张三','2010-1-2',null UNION
SELECT '李四','2011-1-2',null UNION
SELECT '王五','2012-2-2',null UNION
SELECT '赵六','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 A
ORDER 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 all
select '2011-1-2',null union all
select '2012-2-2',null union all
select '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)
)
GO
INSERT INTO tba 
SELECT '张三','2010-1-2',null UNION
SELECT '李四','2011-1-2',null UNION
SELECT '王五','2012-2-2',null UNION
SELECT '赵六','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天来计算,但存在是否是润年的问题