我需要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日期。 请帮忙
答案 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;
以下块将根据您的要求更新日期。使用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;
输出如下所示:
<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;