0

日付フィールドを更新する必要があるテーブルがあります: EFFECTIVE_DATE と EXPIRATION_DATE。AGREEMENT_NO = 212132647 および OFFER_INSTANCE_ID=506412800 の 4 つの行があります。

AGREEMENT_NO PARAM_SEQ_NO PARAM_NAME            PARAM_VALUES   EFFECTIVE_DATE               EXPIRATION_DATE      OFFER_INSTANCE_ID
------------ ------------ --------------------- -------------- -------------------- -------------------- ---------- 
   212132647    152507704 SDG primary CTN value 3095334348     10-JUN-2013:00:00:00 10-JUN-2013:00:00:00 506412800 

   212132647    152509361 SDG primary CTN value 3095334356     10-JUN-2013:00:00:00 10-JUN-2013:00:00:00 506412800 

   212132647    152509421 SDG primary CTN value 3095334350     10-JUN-2013:00:00:00 10-JUN-2013:00:00:00 506412800 

   212132647    152509464 SDG primary CTN value 3095328533     10-JUN-2013:00:00:00 10-JUN-2013:00:00:00 506412800 

以下のようにすべての effective_date と有効期限を更新したい:

AGREEMENT_NO PARAM_SEQ_NO PARAM_NAME            PARAM_VALUES   EFFECTIVE_DATE               EXPIRATION_DATE      OFFER_INSTANCE_ID
------------ ------------ --------------------- -------------- -------------------- -------------------- ---------- 
   212132647    152507704 SDG primary CTN value 3095334348     10-JUN-2013:00:00:00 10-JUN-2013:00:00:01 506412800 

   212132647    152509361 SDG primary CTN value 3095334356     10-JUN-2013:00:00:01 10-JUN-2013:00:00:02 506412800 

   212132647    152509421 SDG primary CTN value 3095334350     10-JUN-2013:00:00:02 10-JUN-2013:00:00:03 506412800 

   212132647    152509464 SDG primary CTN value 3095328533     10-JUN-2013:00:00:03 10-JUN-2013:00:00:04 506412800 

これらの値を直接更新できる方法はありますか

update table1 set expiration_date = effective_date + 1/24/3600 where <somecondition>
and for next row: effective_date = old_exp_date + 1/24/3600 , expiration_date = effective_date + 1/24/3600

すべての行に対して。

4

2 に答える 2

0

以下は、シーケンス内のレコードの数をカウントするというかなり強引な方法です。

update table1
    set effective_date = effective_date +
                          (select count(*) - 1
                           from table1 t2
                           where t2.agreement_no = table1.agreement_no and
                                 t2.expiration_date = table1.expiration_date and
                                 t2.effective_date = table1.effective_date and
                                 t2.param_seq_no <= table1.param_seq_no
                          ) / (24*60*60)
       expiration_date = expiration_date +
                          (select count(*)
                           from table1 t2
                           where t2.agreement_no = table1.agreement_no and
                                 t2.expiration_date = table1.expiration_date and
                                 t2.effective_date = table1.effective_date and
                                 t2.param_seq_no <= table1.param_seq_no
                          ) / (24*60*60)
于 2013-06-11T12:14:21.793 に答える