在oracle数据库清理分区的时候,需要把一段时间以前的分区清空,
用到的语句是
select SUBSTR(PARTITION_name, 4),
to_date(SUBSTR(PARTITION_name, 4), 'yyyymmdd')
from user_segments
where segment_name = 'CHECK_TAB_COL_VALID'
--and partition_name <> 'PH_MAX'-----1
--and SUBSTR(PARTITION_name, 4)<>'MAX'------2
and to_date(SUBSTR(PARTITION_name, 4), 'yyyymmdd') <> date'2019-09-27'
想探讨的是为什么如上语句中在条件当中的 1的写法为什么没有起倒过滤'PH_MAX'作用,to_date(SUBSTR(PARTITION_name, 4), 'yyyymmdd') 还是将PH_MAX 的记录传入to_date(SUBSTR(PARTITION_name, 4), 'yyyymmdd') 函数转化为时间,故有报错 ORA-01841: (完整) 年份值必须介于 -4713 和 +9999 之间, 且不为 0
但是在2的写法就有起倒过滤作用,
另关于系统表和自己建的表的区别数据一致的情况下,为什么user_segments
1的写法不行,自己创建的表第一种写法就可以,
还有关于字查询,查询顺序的探讨:在寻找问题原因的时候,测试了这种写法
select * from (select to_date(SUBSTR(PARTITION_name,4),'yyyymmdd')time from user_segments where segment_name='CHECK_TAB_COL_VALID'
and partition_name<>'PH_MAX') where time<date'2019-09-27'
依然会报:ORA-01841错误,这种查询的逻辑是不是先吧()里面的记录先查询出来?在做时间条件的判断?但是为什么还是会报?ORA-01841错误