Oracle 检查 DATE 列 RANGE 分区已有分区的最大日期时间
-- 方法1:SYS.TABPART$ 计算时间日期
WITH THIS_PART AS
(SELECT TABLE_OWNER, TABLE_NAME, PARTITION_NAME
FROM DBA_TAB_PARTITIONS
WHERE (TABLE_OWNER, TABLE_NAME, PARTITION_POSITION) IN
(SELECT B.TABLE_OWNER,
B.TABLE_NAME,
MAX(B.PARTITION_POSITION) - 1 POSITION
FROM DBA_TAB_PARTITIONS B
JOIN DBA_USERS DU
ON B.TABLE_OWNER = DU.USERNAME
AND DU.ACCOUNT_STATUS = 'OPEN'
WHERE B.TABLE_OWNER NOT IN
('SYS', 'SYSTEM', 'DBSNMP', 'MGMT_VIEW', 'SYSMAN', 'SH')
GROUP BY B.TABLE_OWNER, B.TABLE_NAME)),
ALL_PART AS
(SELECT U.NAME USERNAME,
O.NAME TABLENAME,
O.SUBNAME PARTNAME,
TO_NUMBER(SUBSTR(RAWTOHEX(CAST(BHIBOUNDVAL AS RAW(8))), 3, 2), 'XX') - 100 Y1,
TO_NUMBER(SUBSTR(RAWTOHEX(CAST(BHIBOUNDVAL AS RAW(8))), 5, 2), 'XX') - 100 Y2,
TO_NUMBER(SUBSTR(RAWTOHEX(CAST(BHIBOUNDVAL AS RAW(8))), 7, 2), 'XX') M,
TO_NUMBER(SUBSTR(RAWTOHEX(CAST(BHIBOUNDVAL AS RAW(8))), 9, 2), 'XX') D,
TO_NUMBER(SUBSTR(RAWTOHEX(CAST(BHIBOUNDVAL AS RAW(8))), 11, 2), 'XX') - 1 HH,
TO_NUMBER(SUBSTR(RAWTOHEX(CAST(BHIBOUNDVAL AS RAW(8))), 13, 2), 'XX') - 1 MI,
TO_NUMBER(SUBSTR(RAWTOHEX(CAST(BHIBOUNDVAL AS RAW(8))), 15, 2), 'XX') - 1 SS
FROM SYS.TABPART$ TP, SYS.OBJ$ O, SYS.USER$ U
WHERE TP.OBJ# = O.OBJ#
AND O.OWNER# = U.USER#
AND U.NAME NOT IN
('SYS', 'SYSTEM', 'DBSNMP', 'MGMT_VIEW', 'SYSMAN', 'SH')),
TMP AS
(SELECT T2.USERNAME,
T2.TABLENAME,
T2.PARTNAME,
TO_DATE(TRIM(TO_CHAR(T2.Y1 * 100 + T2.Y2, '9999') || '-' ||
TO_CHAR(T2.M, 'FM09') || '-' || TO_CHAR(T2.D, 'FM09') || ' ' ||
TO_CHAR(T2.HH, 'FM09') || ':' ||
TO_CHAR(T2.MI, 'FM09') || ':' ||
TO_CHAR(T2.SS, 'FM09')),
'YYYY-MM-DD HH24:MI:SS') MAX_RANGE
FROM THIS_PART T1
JOIN ALL_PART T2
ON T1.TABLE_OWNER = T2.USERNAME
AND T1.TABLE_NAME = T2.TABLENAME
AND T1.PARTITION_NAME = T2.PARTNAME)
SELECT * FROM TMP WHERE MAX_RANGE <= SYSDATE + 365 ORDER BY USERNAME, TABLENAME;
-- 方法2:取值long字段转换后截取字符串,依赖日期写全了 如2021-09-16 00:00:00,或2021/09/16 00:00:00
WITH XML AS
(SELECT DBMS_XMLGEN.GETXMLTYPE('SELECT TABLE_OWNER, TABLE_NAME, PARTITION_NAME, HIGH_VALUE FROM DBA_TAB_PARTITIONS WHERE (TABLE_OWNER, TABLE_NAME, PARTITION_POSITION) IN (SELECT B.TABLE_OWNER, B.TABLE_NAME, MAX(B.PARTITION_POSITION) - 1 POSITION FROM DBA_TAB_PARTITIONS B WHERE TABLE_OWNER NOT IN (''SYS'', ''SYSTEM'', ''DBSNMP'', ''MGMT_VIEW'', ''SYSMAN'',''SH'') AND TABLE_OWNER IN (SELECT USERNAME FROM DBA_USERS WHERE ACCOUNT_STATUS=''OPEN'') GROUP BY B.TABLE_OWNER, B.TABLE_NAME) ORDER BY 1,2') AS X
FROM DUAL),
MAXPART AS
(SELECT EXTRACTVALUE(RWS.OBJECT_VALUE, '/ROW/TABLE_OWNER') TABLE_OWNER,
EXTRACTVALUE(RWS.OBJECT_VALUE, '/ROW/TABLE_NAME') TABLE_NAME,
EXTRACTVALUE(RWS.OBJECT_VALUE, '/ROW/PARTITION_NAME') PARTITION,
EXTRACTVALUE(RWS.OBJECT_VALUE, '/ROW/HIGH_VALUE') HIGH_TEXT
FROM XML X, TABLE(XMLSEQUENCE(EXTRACT(X.X, '/ROWSET/ROW'))) RWS
ORDER BY EXTRACTVALUE(RWS.OBJECT_VALUE, '/ROW/TABLE_NAME')),
DT AS
(SELECT TABLE_OWNER,
TABLE_NAME,
PARTITION,
TO_DATE(SUBSTR(M.HIGH_TEXT, INSTR(M.HIGH_TEXT, '20', -3), 19), 'YYYY-MM-DD HH24:MI:SS') RANGE_DT
FROM MAXPART M)
SELECT * FROM DT WHERE DT.RANGE_DT <= SYSDATE + 365;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。