0

次の週にマイルストーン記念日を迎えた従業員を識別するオラクル SQL を作成する必要があります。実際には 2 つのコードを作成する必要がありました。1 つは、今年節目を迎えたすべての従業員を特定するためのもので、2 つ目は、来週節目を迎えた従業員を特定するためのものです。

したがって、今週このコードを実行すると、来週記念日を迎える人をすべてキャプチャできます。このコードでは、特定の日付の記念日を識別するコードを作成できました...しかし、来週の 7 日間すべてを調べて、誰が記念日を持っているかを示すコードを作成することはできません。

以下は、2013 年 3 月 27 日の今日のクエリを実行した場合に、2013 年 3 月 31 日日曜日に記念日を持つ人を特定するためのクエリです。

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)
4

3 に答える 3

0

ANSI 標準の結合と意味のあるエイリアスpxを使用するようにクエリを修正する必要があります ( .per_people_xa

いずれにせよ、問題を解決する 1 つの方法は、一連の数値をクロス結合し、将来の日数に使用することです。勤続年数の計算は、単に年数の差です。記念日の小切手は、月と日だけを使用します。

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)
于 2013-03-28T02:46:19.600 に答える
0

これは役立つかもしれません - emp テーブルに基づく一般的な例。入社日から 2013 年 3 月の最終日までの年数。私が問題を正しく理解していれば、SMITH は 2013 年 3 月 31 日までに 32 年 3 か月働いていたことになります。記念日ではありません。ジョーンズ勤続32年0ヶ月記念!記念日は毎週ではなく、年と月に基づいていると仮定するのが合理的であることを願っています.

月の最後の日を任意の日付 (今日から 1 週間など) に変更できます。例: 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 --
...
...
于 2013-03-28T13:19:44.770 に答える