Oracle JD Edwards中删除近7天外朱利安日期数据的SQL写法
JD Edwards ERP Oracle SQL 朱利安日期字段清理近7天外数据方案
核心逻辑说明
JD Edwards存储的朱利安日期为CYYDDD格式,和你日常使用的转换规则一致:数值加1900000后即可按YYYYDDD(年+年内天数)转为常规日期。
编写清理SQL时注意几个要点:
- 不要对表中
SZUPMJ字段套转换函数做比对,会导致字段索引失效,数据量大时性能极差,正确做法是先算出7天前的日期对应的JDE朱利安阈值,直接和原始字段值比对 - 按现有转换规则,
SZUPMJ=0代表空日期,这类数据不属于近7天有效数据,需要一并清理 - 禁止使用列序号定位字段,直接写
SZUPMJ字段名即可,避免表结构调整后条件匹配出错
执行步骤
第一步:先查询校验待删除数据范围(必须先做,避免误删)
将SQL中的你的实际表名替换为要清理的业务表名,执行后确认返回的数据确实是需要删除的超期/空日期数据:
SELECT * FROM 你的实际表名 WHERE SZUPMJ < ( -- 计算7天前日期对应的JDE朱利安格式阈值 SELECT (EXTRACT(YEAR FROM TRUNC(SYSDATE) - 7) - 1900) * 1000 + (TRUNC(SYSDATE) - 7 - TRUNC(TRUNC(SYSDATE) - 7, 'YYYY') + 1) AS cutoff_jde_date FROM dual ) OR SZUPMJ = 0;
你提供的样例数据中SZUPMJ值为106108、106109,对应2006年的日期,会被判定为超期数据出现在查询结果中,符合预期。
第二步:执行删除操作
确认查询返回的待删除数据无误后,执行删除语句:
DELETE FROM 你的实际表名 WHERE SZUPMJ < ( SELECT (EXTRACT(YEAR FROM TRUNC(SYSDATE) - 7) - 1900) * 1000 + (TRUNC(SYSDATE) - 7 - TRUNC(TRUNC(SYSDATE) - 7, 'YYYY') + 1) FROM dual ) OR SZUPMJ = 0;
第三步:校验结果后提交
删除后可以再查一遍表中剩余数据的日期范围,确认符合保留近7天数据的要求,再提交事务:
COMMIT;
调整说明
如果你的业务定义中"最近7天"需要包含第7天当天,把所有阈值计算里的TRUNC(SYSDATE) - 7改为TRUNC(SYSDATE) - 6即可。
内容的提问来源于stack exchange,提问作者user9580189
相关产品推荐
相关产品推荐

