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

一个超级简单的员工入职年限人数统计问题!
因为刚学了datediff()和datepart()的用法,所以就耍了下小聪明,建了一个订单信息表。
select datediff(year,datepart(year,入职时间),datepart(year,getdate())),count(*)
from 订单信息
group by datediff(year,datepart(year,入职时间),datepart(year,getdate()))
输出结果如下:1
  1 0 8
这个结果显然不是我想要的结果。于是脑筋一转,很快就写出了下列查询语句。
select datediff(year,入职时间,getdate()),count(*)
from 订单信息
group by datediff(year,入职时间,getdate())
输出结果如下:1,2,3,4是列名,6,7,9,11是入职年限。4,2,1,1是员工个数。
1 6 4
2 7 2
3 9 1
4 11 1
显然这个结果是对的,是我想要的结果。

但是我觉得两条查询语句的作用是完全一样的啊。为什么第一个查询语言会有错误呢?查不出结果。语法上面看上去好像没有错误啊。或许这真是个无聊的问题,但是我还是希望能够向大家学习。希望大家不吝赐教!!!

------解决方案--------------------
作用怎么可能一样,
datediff(year,datepart(year,入职时间),datepart(year,getdate()))
 ==》datediff(year,2009,2011)
数据库会把2009和2011隐式转换为其他的时间,具体转换为什么没测试过,可以肯定的是转换后的年份相差一年。你自己可以做测试

datediff(year,入职时间,getdate())这个才是计算入职时间与当前时间的年份时差
------解决方案--------------------
select datediff(year,datepart(year,入职时间),datepart(year,getdate())),count(*)
from 订单信息
group by datediff(year,datepart(year,入职时间),datepart(year,getdate()))
是因为你上面的你用datepart(year,入职时间)取的是入职的年份,类型为数值型,用datepart(year,getdate()))取的是现在的年份,类型也是数值型,而DateDiff这个函数是用来计算日期类型的差值的,所以你是得不到正确结果的。
当然你也像下面这样写,也能得到正确的结果
select datepart(year,入职时间)-datepart(year,getdate()),count(*)
from 订单信息
group by datepart(year,入职时间)-datepart(year,getdate())