当新的from_date到达时,将当前to_date减少一个的逻辑

时间:2016-01-18 07:08:10

标签: plsql

我需要pl / sql中的逻辑来将valid_to日期字段减少一天而不是新的from_date。

示例:我当前的日期和日期是: 来自:Jan-18-2016 致:Dec-31-9999

当新来的日期到来时: 新来自:2016年2月1日至2016年 新至:Dec-31-9999

我希望我的旧to_date成为Jan_31-2016(即,(Feb-1-2016)-1)

目前我面临多个数据问题,因为同时会有两个valid_to日期。 请帮忙

1 个答案:

答案 0 :(得分:0)

我创建了包含以下数据的虚拟表:



<table>
  <tr>
    <th>PRODUCT</th>
    <th>FROM_DATE</th>
    <th>VALID_TO</th>
  </tr>
  <tr>
    <td>ABC</td>
    <td>18-Jan-2016</td>
    <td>31-Dec-9999</td>
  </tr>
  <tr>
    <td>ABC</td>
    <td>01-Feb-2016</td>
    <td>31-Dec-9999</td>
  </tr>
  <tr>
    <td>DEF</td>
    <td>01-Aug-2016</td>
    <td>31-Dec-9999</td>
  </tr>
  <tr>
    <td>DEF</td>
    <td>01-Sep-2016</td>
    <td>31-Dec-9999</td>
  </tr>
  <tr>
    <td>GHI</td>
    <td>01-Mar-2016</td>
    <td>31-Dec-9999</td>
  </tr>
</table>
&#13;
&#13;
&#13;

以下块将根据您的要求更新日期。使用LAG和LEAD功能,您可以访问多行而无需连接同一个表。 LAG用于访问上一行,LEAD用于访问下一行。

BEGIN

  FOR I IN (SELECT NVL(LEAD(T.FROM_DATE)
                       OVER(PARTITION BY T.PRODUCT ORDER BY T.FROM_DATE) - 1,
                       T.VALID_TO) NEW_VALID_TO,
                   PRODUCT,
                   FROM_DATE
              FROM PRODUCT_TABLE T) LOOP

    UPDATE PRODUCT_TABLE A
       SET A.VALID_TO = I.NEW_VALID_TO
     WHERE A.PRODUCT = I.PRODUCT
       AND A.FROM_DATE = I.FROM_DATE;

     COMMIT;

  END LOOP;

END;

输出如下所示:

&#13;
&#13;
<table>
  <tr>
    <th>PRODUCT</th>
    <th>FROM_DATE</th>
    <th>VALID_TO</th>
  </tr>
  <tr>
    <td>ABC</td>
    <td>18-Jan-2016</td>
    <td>31-Jan-2016</td>
  </tr>
  <tr>
    <td>ABC</td>
    <td>01-Feb-2016</td>
    <td>31-Dec-9999</td>
  </tr>
  <tr>
    <td>DEF</td>
    <td>01-Aug-2016</td>
    <td>31-Aug-2016</td>
  </tr>
  <tr>
    <td>DEF</td>
    <td>01-Sep-2016</td>
    <td>31-Dec-9999</td>
  </tr>
  <tr>
    <td>GHI</td>
    <td>01-Mar-2016</td>
    <td>31-Dec-9999</td>
  </tr>
</table>
&#13;
&#13;
&#13;