Oracle DELETE语句SYSDATE处理:调整删除逻辑保留2019年4月起数据
修改后的DELETE语句
DELETE FROM XYZ WHERE check_date < DATE '2019-04-01';
逻辑说明
- 原语句中基于
SYSDATE动态计算24个月前分界的逻辑,替换为固定的日期判断条件,因为当前需求的删除范围是固定历史区间,不需要随系统时间动态变化。 - 新条件
check_date < DATE '2019-04-01'的删除范围完全匹配需求:所有早于2019年4月1日零点的记录都会被删除,无遗漏覆盖31-MAR-2019全天的所有时间点数据,同时完整保留2019年4月1日及之后的全部记录。 - 没有采用「<= 2019-03-31」的写法,是因为Oracle的
DATE类型默认带时分秒精度,若直接按天做大小判断,会漏删3月31日零点之后的带具体时间的记录。 - 采用
DATE 'YYYY-MM-DD'的ANSI日期字面量是Oracle中最稳妥的日期写法,不受会话的NLS_DATE_FORMAT配置影响,不会出现隐式转换错误。如果偏好显式转换的写法,也可以使用等价的TO_DATE实现:DELETE FROM XYZ WHERE check_date < TO_DATE('2019-04-01', 'YYYY-MM-DD');
实操建议
执行删除操作前,建议先校验待删除的数据范围是否符合预期,避免误操作:
-- 统计待删除的总数据量 SELECT COUNT(*) FROM XYZ WHERE check_date < DATE '2019-04-01'; -- 查看待删除范围的最大/最小日期,确认是否覆盖所有3月及之前的记录 SELECT MIN(check_date), MAX(check_date) FROM XYZ WHERE check_date < DATE '2019-04-01';
内容的提问来源于stack exchange,提问作者king_vegeta
相关产品推荐
相关产品推荐

