首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于计算服务年限的SQL代码

用于计算服务年限的SQL代码
EN

Stack Overflow用户
提问于 2013-03-28 10:36:49
回答 3查看 5.1K关注 0票数 0

我必须创建一个oracle sql来标识在下周内达到里程碑周年纪念的员工。实际上,我不得不创建两个代码。一个用于标识今年达到里程碑周年纪念日的每个员工,另一个用于标识下周达到里程碑周年纪念日的所有员工。

因此,如果我这周运行代码,它将捕获下周有周年纪念的任何人。对于这段代码,我能够创建一个代码来标识特定date...but上的周年纪念,但我无法创建一个代码来查看下周的所有7天,并告诉我谁都有周年纪念。

以下是用于标识在2013年3月31日周日的任何周年纪念的查询,该查询在今天3月27日运行。

代码语言:javascript
复制
SELECT a.full_name AS Full_Name,
       b.adjusted_svc_date AS Service_Date,
       d.name Job_tittle,
       TRUNC ( (TO_NUMBER (TO_CHAR (SYSDATE + 4, 'mmddyyyy'))) -- TO_NUMBER (TO_CHAR (SYSDATE+4, 'MM/DD/YYYY'))
              - TO_NUMBER (TO_CHAR (b.adjusted_svc_date, 'mmddyyyy')))
          AS Years_OF_Service
  FROM per_people_x a,
       per_periods_of_service b,
       per_assignments_x c,
       per_jobs d
WHERE     a.person_id = c.person_id
       AND c.period_of_service_id = b.period_of_service_id
       AND c.job_id = d.job_id
       AND TRUNC (
                (TO_NUMBER (TO_CHAR (SYSDATE + 4, 'mmddyyyy')))
              - TO_NUMBER (TO_CHAR (b.adjusted_svc_date, 'mmddyyyy'))) IN
              (5, 10, 15, 20, 25, 30)
       AND a.person_type_id IN (6, 7)
EN

回答 3

Stack Overflow用户

发布于 2013-04-04 04:19:32

我结合了你们所有人提供的信息,并能够在每个星期一获得code.Here是运行代码的代码。

代码语言:javascript
复制
SELECT ppx.full_name AS Full_Name,
       ps.adjusted_svc_date AS Service_Date,
       pj.name Job_tittle,
         (TO_NUMBER (TO_CHAR (SYSDATE, 'YYYY')))
       - TO_NUMBER (TO_CHAR (ps.adjusted_svc_date, 'YYYY'))
          AS Years_OF_Service
  FROM per_peoples_x ppx,
       per_periods_of_services ps,
       per_assignment_x pax,
       per_jobs pj,
       (SELECT 6 AS d FROM DUAL
        UNION ALL
        SELECT 7 FROM DUAL
        UNION ALL
        SELECT 8 FROM DUAL
        UNION ALL
        SELECT 9 FROM DUAL
        UNION ALL
        SELECT 10 FROM DUAL
        UNION ALL
        SELECT 11 FROM DUAL
        UNION ALL
        SELECT 12 FROM DUAL
        ) days_in_future
 WHERE     ppx.person_id = pax.person_id
       AND pax.period_of_service_id = ps.period_of_service_id
       AND pax.job_id = pj.job_id
       AND   (TO_NUMBER (TO_CHAR (SYSDATE, 'YYYY')))
           - TO_NUMBER (TO_CHAR (ps.adjusted_svc_date, 'YYYY')) IN
              (5, 10, 15, 20, 25, 30)
       AND TO_CHAR (SYSDATE + days_in_future.d, 'mmdd') =
              TO_CHAR (adjusted_svc_date, 'mmdd')
       AND ppx.person_type_id IN (6, 7)
票数 1
EN

Stack Overflow用户

发布于 2013-03-28 10:46:20

您真的应该修复您的查询以使用ANSI标准连接和有意义的别名(也许per_people_xpx而不是a

在任何情况下,解决问题的一种方法是交叉连接一组数字,并在未来几天内使用它们。对服务年限的计算只是年限之间的差额。周年纪念的支票只使用月份和日期。

代码语言:javascript
复制
SELECT a.full_name AS Full_Name,
       b.adjusted_svc_date AS Service_Date,
       d.name Job_tittle,
       year(sysdate+days_in_future.d) - year(adjusted_svc_date) AS Years_OF_Service
  FROM per_people_x a,
       per_periods_of_service b,
       per_assignments_x c,
       per_jobs d,
       (select 0 as d from dual union all select 1 from dual union all select 2 from dual
       ) days_in_future
WHERE     a.person_id = c.person_id
       AND c.period_of_service_id = b.period_of_service_id
       AND c.job_id = d.job_id
       and to_char(sysdate+days_in_future.d, 'mmdd') = to_char(adjusted_svc_date, 'mmdd')
       and year(sysdate+days_in_future.d) - year(adjusted_svc_date) in (5, 10,15, 20, 25, 30)
       AND a.person_type_id IN (6, 7)
票数 0
EN

Stack Overflow用户

发布于 2013-03-28 21:19:45

这可能会有所帮助-基于emp表的通用示例。租用日期与2013年3月最后一天之间的年份和月份。如果我正确理解了这个问题,那么到2013年3月31日,SMITH工作了32年零3个月--而不是周年纪念。琼斯工作了32年零0个月--周年纪念!我希望假设周年纪念是基于年份和月份而不是每周的是合理的。

您可以将月份的最后一天更改为任何日期-从今天起一周等。例如:Last_Day(Trunc(SYSDATE))+7...结果应该是相同的。

代码语言:javascript
复制
SELECT * FROM 
(
 SELECT ename
      , EXTRACT(YEAR FROM (Last_Day(Trunc(SYSDATE)) - hiredate) YEAR TO MONTH ) years -- years from last day of Mar-2013 --
      , EXTRACT(MONTH FROM (Last_Day(Trunc(SYSDATE)) - hiredate) YEAR TO MONTH ) mnths       -- months from last day of Mar-2013 --
   FROM scott.emp 
 )
WHERE mnths = 0 -- if months = 0 then it is an anniversary --
/

ENAME    YEARS    MNTHS
-------------------------
SMITH    32        3
ALLEN    32        1
WARD     32        1
JONES    32        0  -- Only this row will be returned with Where mnths = 0 --
...
...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15673288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档