0

Activityとのような列を持つasというテーブルがactivity_idありactivity_dateます。

以下のようなアクティビティテーブルのデータを考えてみましょう。

activity_id    activity_date    
1              1st June
2              1st July
3              1st August
4              1st September
5              1st October

アクティビティ3の日付を変更したいのですが、他のアクティビティがすでにあるため、日付を変更することはできません1st July1st September

アクティビティ3の有効な日付は〜の間のみ2nd Julyです30th August

同様に、アクティビティ1の場合、有効な新しい日付は。より前の任意の日付にすることができます1st July

同様に、アクティビティ5の場合、有効な新しい日付は2nd September、最後のアクティビティとしての将来の任意の日付までの範囲になります。

新しい日付が範囲内にない場合は、フロントエンドのユーザーに検証メッセージを送信する必要があります。 クエリへの入力は、アクティビティIDと新しいアクティビティ日付になります。

以下はDDLスクリプトです

    CREATE TABLE "HEADCOUNT"."ACTIVITY" 
(   "ACTIVITY_ID" NUMBER(*,0) NOT NULL, 
    "ACTIVITY_DATE" DATE
); 

Insert into "HEADCOUNT"."ACTIVITY" (ACTIVITY_ID,ACTIVITY_DATE) values (1,'01-06-2012');
Insert into "HEADCOUNT"."ACTIVITY" (ACTIVITY_ID,ACTIVITY_DATE) values (2,'01-07-2012');
Insert into "HEADCOUNT"."ACTIVITY" (ACTIVITY_ID,ACTIVITY_DATE) values (3,'01-08-2012');
Insert into "HEADCOUNT"."ACTIVITY" (ACTIVITY_ID,ACTIVITY_DATE) values (4,'01-09-2012');
Insert into "HEADCOUNT"."ACTIVITY" (ACTIVITY_ID,ACTIVITY_DATE) values (5,'01-10-2012');
4

2 に答える 2

0

以下のようなクエリを使用して日付制限を検索します(@param_idアクティビティIDを変更して置き換えます)。

SELECT activity_id, activity_date
FROM   activity
WHERE  activity_id = @param_id-1
   OR  activity_id = @param_id+1

このクエリは最大2つの結果を返しますが、最初と最後のアクティビティでは1つだけが返されます。したがって、フロントエンドで結果を読み、何をすべきかを決定する必要があります。

  1. 開始制限の指定: IDの結果は@param_id-1開始日の制限を指定します。このIDの結果がない場合、これは最初のアクティビティであり、開始日の制限はありません。

  2. 終了制限の指定: idの結果は、@param_id+1終了日の制限を指定します。このIDの結果がない場合、これは最後のアクティビティであり、終了日の制限はありません。

  3. 実行または警告:新しい日付が範囲内にある場合は、変更を実行します。それ以外の場合は、ユーザーに警告します。

于 2012-07-30T13:44:49.017 に答える
0

これにより、各行の日付範囲が検索されます。

SELECT activity_id, activity_date
      ,NVL( LAG(activity_date) OVER(ORDER BY activity_id) 
           ,TO_DATE('1900-01-01', 'YYYY-MM-DD')
          ) AS previous_date
      ,NVL( LEAD(activity_date) OVER(ORDER BY activity_id)
           ,TO_DATE('2100-01-01', 'YYYY-MM-DD')
          ) AS next_date
  FROM activity
  ORDER BY activity_id

結果:

                       ACTIVITY_ID ACTIVITY_DATE PREVIOUS_DATE NEXT_DATE
---------------------------------- ------------- ------------- ---------
                                 1 01-JUN-12     01-JAN-00     01-JUL-12 
                                 2 01-JUL-12     01-JUN-12     01-AUG-12 
                                 3 01-AUG-12     01-JUL-12     01-SEP-12 
                                 4 01-SEP-12     01-AUG-12     01-OCT-12 
                                 5 01-OCT-12     01-SEP-12     01-JAN-00

その場合、検証は特定のIDに対して行われます。

"入力日">previous_dateAND"入力日"<next_date

日付範囲は、activity_idで並べ替えた場合、前後のレコードに基づいています。おそらく、順序付けは実際にはactivity_dateによるものでなければなりません。LAGとLEADを使用すると、activity_idsにもギャップが生じます。

于 2012-07-30T14:00:20.763 に答える