2013-03-28 2 views
0

Мне нужно создать оракульный sql, который идентифицирует сотрудников, которые достигли знаменательной годовщины в течение следующей недели. Мне действительно нужно было создать два кода. Один из них, чтобы идентифицировать каждого сотрудника, который в этом году совершает знаменательную годовщину, и второй, чтобы идентифицировать всех, кто попадает в эту веху на следующей неделе.SQL-код для расчета лет службы

Так что, если я запустил код на этой неделе, он захватит всех, кто имеет юбилей на следующей неделе. Для этого кода мне удалось создать код, который будет идентифицировать юбилей в определенную дату ... но я не могу создать код, который будет выглядеть на всех 7 днях следующей недели, и расскажет, кто у всех есть юбилеи.

Вот запрос для идентификации кого-либо с юбилеем в воскресенье 03/31/2013, когда запрос выполняется сегодня 27.03.2012.

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) 
+0

Это общий вопрос Oracle SQL и не имеет абсолютно никакого отношения к Toad. (Его можно запустить во всем, что позволяет Oracle SQL.) Пожалуйста, используйте только теги, которые действительно применяются к вашему вопросу. Благодарю. –

+0

Когда ваша неделя начинается и заканчивается? –

+0

Также, похоже, вы пытаетесь найти значительную годовщину? 5-й, 10-й, 15-й, 25-й и 30-й годы, но не 1-й, 22-й и т. Д. Это правильно? –

ответ

0

Вы действительно должны исправить свой запрос, чтобы использовать стандарт ANSI соединяющую и осмысленные псевдонимы (возможно px для per_people_x, а не a.

В любом случае, один из способов решить вашу проблему, чтобы пересечь присоединиться в набор чисел и использовать их в течение нескольких дней в будущем. Расчет за годы службы просто разница между годами. проверка на юбилей использует только месяц и день.

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

Это может помочь - общий пример, основанный на таблице emp. Годы и месяцы между наемным и последним днем ​​марта 2013 года. Если я правильно понял проблему, тогда SMITH работала 32 года и 3 месяца к 31 марта 2013 года, а не к юбилею. Джонс работал 32 года и 0 месяцев! Я надеюсь, что разумно предположить, что юбилеи, основанные на годах и моли, а не еженедельно.

Вы можете изменить последний день месяца на любую дату - одну неделю с сегодняшнего дня и т. Д. ... Например: Last_Day (Trunc (SYSDATE)) + 7 и т. Д. Результат должен быть таким же.

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 -- 
... 
... 
1

Я объединил информацию вы все представившие и смог получить code.Here код для runnign код на каждый понедельник.

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) 
Смежные вопросы