Sql 试图找出所有员工的平均就业时间

Sql 试图找出所有员工的平均就业时间,sql,oracle,Sql,Oracle,并将其四舍五入到最近的年份 select employee_id, months_between(start_date, sysdate) from job_history; 到目前为止,我已经能够计算出月数 我正在使用12c这就是它的外观 SELECT AVG(DATEDIFF(year,start_date, end_date)) AS AverageLengthOfEmployment from job_history 如果需要平均值,则需要聚合: select avg(months

并将其四舍五入到最近的年份

select employee_id, months_between(start_date, sysdate) 
from job_history;
到目前为止,我已经能够计算出月数


我正在使用12c

这就是它的外观

SELECT AVG(DATEDIFF(year,start_date, end_date)) AS AverageLengthOfEmployment from job_history

如果需要平均值,则需要聚合:

select avg(months_between(sysdate, start_date) ) as avg_months
from job_history;
如果您希望在几年内完成:

select round(avg(months_between(sysdate, start_date))/12) as avg_years
from job_history;
试试这个:

SELECT 
  employee_id
, AVG(CAST( months_between(start_date, sysdate) / 12 AS INTEGER) AS avg_work_years
FROM job_history

在job_history表中是否有一个end date字段?是的,有一个end date字段如果是这样,您想使用end_日期而不是SysDate在这种情况下,所有员工的意思是什么?在职员工和离职员工?还是仅限当前处于活动状态的用户?还有,有没有可能一名员工从2003年到2010年在那里工作,然后离开,但在2015年返回?那么也许这两个时期应该结合起来?在编写代码之前,最好先询问并回答这些问题。这仅适用于在公司工作过且有明确终止日期的员工。请按职务id从职务历史组中选择职务id,roundavgmonths\u Between Start\u date,end\u date作为平均年数;感谢您,我们只需稍加调整就可以让它正常工作@BrandonW-平均年数不除以12?你确定吗?戈登写道,在这两个月之间会产生负数。我编辑了他的文章来纠正这两个问题,但我看到你在没有这些修复的情况下将其标记为正确。你在标记正确之前测试过它吗?你的正确的mathguy我还是SQL新手。这次是正确的。您将月/12转换为整数,然后取平均值?这毫无意义。取平均值并除以12,或除以12并取平均值,仅将转换为整数。在Oracle中,这是通过ROUND函数完成的。嗨,mathguy。这取决于查询的类型。通常你想表达某人在某个地方工作了多少年;然后取平均值;保险公司通过这种方式计算被保险人的雇佣期限和年龄。不过,这取决于商业案例,你是对的。ROUND几乎存在于每个数据库中,但速度要慢得多,因为它是一个浮点操作。硬转换是一个整数运算,速度要快几个数量级。一些DBs地板采用铸造而非圆形。在这种情况下,再加上6个月的时间。令我非常失望的是,Oracle在任何事情上都不做任何整数运算-DATEDIFF?不知道Oracle中存在这种情况。你怀疑OP把问题标错了吗?对不起。当我回答时,它被标记为仅仅是sql我刚刚检查了编辑,我看到了。我应该经常这样做,在我问像我问的那个问题之前——对不起!