0

こんにちは、私はいくつかのコードに取り組んでいます -

1) 平日 (月曜日から木曜日) の東部標準時間 (アメリカ) で午後 5 時以降、平日の東部標準時間 (アメリカ) で午前 7 時 59 分 59 秒より前にリクエストが送信された場合、日付は次のビジネスに変更されます。日 @ 午前 8:00。

2) リクエストが金曜日の午後 5 時から次の月曜日の午前 7 時 59 分 59 秒までの間に送信された場合、時間は上記のようにロールアップされます。

3) 次に、コードは別の日付フィールドをチェックして、「受け入れられた」時間 (送信された日付または「新しい」日付から 4 時間以内) を比較する必要があります。

例えば:

リクエスト 001 が 04/17/2013 02:00AM に送信された場合、新しい日付は 04/17/2013 08:00AM になります。

リクエスト 002 が 04/17/2013 06:45PM に送信された場合、新しい日付は 04/18/2013 08:00AM になります。

リクエスト 003 が 2013 年 4 月 20 日午前 5 時 45 分 (これは土曜日) に送信された場合、新しい日付は 2013 年 4 月 22 日午前 8 時になります。

最終的なコードですべてをまとめることができることを期待して、コードをまとめてピースメールしてきました。


これは私がこれまでに持っているものです(日付変換コード用)

            ,CASE 
        WHEN to_date(('DATE_REQUESTED'),'DAY',nls_date_language = English) in ('Friday','Saturday'))
        THEN NEXT_DAY(to_date(('DATE_REQUESTED'),'Monday') + 8 / 24)
        ELSE DATE_REQUESTED 
    END as Weekend_Converted

リクエストが 4 時間以内に受け入れられたかどうかを確認するコードの場合

     SELECT RIT_Request_v.*
     ,CASE 
     WHEN DATE_ACCEPTED IS NULL THEN 'NOT ACKNOWLEDGED'
     WHEN DATE_ACCEPTED > (DATE_REQUESTED + 4 / 24) THEN 'OVER 4 HOURS'
     ELSE 'WITHIN 4 HOURS'
     END AS Acknowledgement

     FROM RIT.RIT_Request_v

     WHERE (("DATE_REQUESTED") BETWEEN trunc(sysdate, 'YYYY') AND trunc(sysdate))

以下のコメントの 1 つに記載されているように、コードを更新したところ、「無効な識別子」エラーが発生しています -

    SELECT RIT_Request_v.*
    ,CASE WHEN TO_CHAR(DATE_REQUESTED,'D') IN (1,6,7)
          THEN NEXT_DAY(DATE_REQUESTED,'MONDAY')
          ELSE DATE_REQUESTED + 1 END AS Weekend_Converted

    ,CASE WHEN DATE_ACCEPTED IS NULL THEN 'NOT ACKNOWLEDGED'
          WHEN WEEKEND_CONVERTED IS NULL THEN 'NOT ACKNOWLEDGED'
          WHEN DATE_ACCEPTED > (DATE_REQUESTED + 4 / 24) THEN 'OVER 4 HOURS'
          WHEN DATE_ACCEPTED > (Weekend_Converted + 4 / 24) THEN 'OVER 4 HOURS'
          ELSE 'WITHIN 4 HOURS' END AS Acknowledgement

    FROM RIT.RIT_Request_v

    WHERE (("DATE_REQUESTED") BETWEEN trunc(sysdate, 'YYYY') AND trunc(sysdate))

                AND FORM_ID IN         (2011,2014,5007,5036,5039,7007,10000,10001,10005,10007,10011,10024,10025,10029,10032,10033,10034,10035,10036,10037,11011,11013,11999,36001)
4

1 に答える 1

0

case元のバージョンでは週末weekend_convertedのみを処理しているようで、金曜日の何かが含まれているため混乱しているようです。更新されたものは、すべての日付を翌日または次の月曜日のいずれかの同じ時間に08:00シフトしており、平日のほとんどでその日をまったくシフトしない部分とその両方を失います。

疑似列を定義してweekend_convertedから同じレベルのクエリで使用しようとしたため、2 番目のバージョンで「無効な識別子」を取得していましたが、これは許可されていません。あるレベルで定義してから、アウターで参照する必要がありますselect

これはあなたのルールをカバーしているようですが、追加の日付でテストしていません:

select r.*,
    case
        when to_char(date_requested, 'DY',
                'NLS_DATE_LANGUAGE=English') in ('SAT', 'SUN')
            or (to_char(date_requested, 'DY',
                'NLS_DATE_LANGUAGE=English') = 'FRI'
                and extract(hour from cast(date_requested as timestamp)) >= 17)
        then trunc(next_day(date_requested, 'MON')) + interval '8' hour
        when extract(hour from cast(date_requested as timestamp)) >= 17
        then trunc(date_requested) + interval '1' day + interval '8' hour
        when extract(hour from cast(date_requested as timestamp)) < 8
        then trunc(date_requested) + interval '8' hour
        else date_requested
    end as clock_start
from rit_request_v r;

NLS_DATE_LANGUAGEただし、これがどこで実行されるかわからない場合はを強制することをお勧めしますが、このnext_day関数では day パラメータをローカル言語にする必要があるため、特定のセッションではなくセッション全体に設定することをお勧めします。関数ごとに。

とにかく、それは与えます:

DATE_REQUESTED   DATE_ACCEPTED       FORM_ID CLOCK_START
---------------- ---------------- ---------- ----------------
2013-04-17 02:00 2013-04-17 11:59       5007 2013-04-17 08:00
2013-04-17 18:45 2013-04-18 11:59       5007 2013-04-18 08:00
2013-04-13 05:45                        5007 2013-04-15 08:00

これをインライン ビューまたは CTE として使用できます。

with t as (
select r.*,
    case
        when to_char(date_requested, 'DY',
                'NLS_DATE_LANGUAGE=English') in ('SAT', 'SUN')
            or (to_char(date_requested, 'DY',
                'NLS_DATE_LANGUAGE=English') = 'FRI'
                and extract(hour from cast(date_requested as timestamp)) >= 17)
        then trunc(next_day(date_requested, 'MON')) + interval '8' hour
        when extract(hour from cast(date_requested as timestamp)) >= 17
        then trunc(date_requested) + interval '1' day + interval '8' hour
        when extract(hour from cast(date_requested as timestamp)) < 8
        then trunc(date_requested) + interval '8' hour
        else date_requested
    end as clock_start
from rit_request_v r
where date_requested between trunc(sysdate, 'YYYY') and trunc(sysdate)
and form_id in (2011, 2014, 5007, 5036, 5039, 7007, 10000, 10001, 10005, 10007, 10011, 10024, 10025, 10029, 10032, 10033, 10034, 10035, 10036, 10037, 11011, 11013, 11999, 36001)
)
select t.*,
    case
        when date_accepted is null then 'NOT ACKNOWLEDGED'
        when date_accepted > (clock_start + interval '4' hour)
        then 'OVER 4 HOURS'
        else 'WITHIN 4 HOURS'
    end as acknowledgement
from t;

これにより、次のことが得られます。

DATE_REQUESTED   DATE_ACCEPTED       FORM_ID CLOCK_START      ACKNOWLEDGEMENT
---------------- ---------------- ---------- ---------------- ----------------
2013-04-17 02:00 2013-04-17 11:59       5007 2013-04-17 08:00 WITHIN 4 HOURS
2013-04-17 18:45 2013-04-18 11:59       5007 2013-04-18 08:00 WITHIN 4 HOURS
2013-04-13 05:45                        5007 2013-04-15 08:00 NOT ACKNOWLEDGED

clock_startこの場合はCTEで、より低いレベルで定義されているため、参照できます。

私の日付があなたの日付とはまったく異なる形式になっていることに気付くでしょう。通常は、これらのフィールドを表示用にラップする必要があると思いますto_char()が、(a) これが SQL*Plus で表示されるのか、どこに表示されるのか、または他の何かにフィードされて日付のままにする必要があるのか​​どうかは明確ではありません。セッションを変更して NLS_DATE_LANGUAGE を確認する場合は、そこにいる間に NLS_DATE_FORMAT を設定できます。ここでも、ダウ船を実行している場所によって異なります。

sysdateまた、間違ったレベルでチェックすることもできます。このままでは、clock_start事前調整時間に取り組んでいるため、今日の 08:00 のものが含まれます。それを外側に移動すると、代わりにその日付範囲にあるselectことを確認できます。clock_startもちろん、意図的にそれを行った可能性もあります。

それが役立つことを願っています...

于 2013-04-18T23:52:28.247 に答える