我一直在努力理解为什么这个查询不起作用。此所有者的所有分区名称都具有“R_DATE_20170831”格式的值。但是下面的查询总是返回错误ORA-01841(完整)年份必须介于-4713和+9999之间,而不是0.当我单独显示每个日期部分时,它们都在该范围内。我的NLS_DATE_FORMAT显示值'DD-MON-RR'。
SELECT COUNT(*)
FROM dba_tab_partitions
WHERE table_owner = 'myId' AND
TO_DATE(SUBSTR(partition_name,INSTR(partition_name,'_',1,2) + 1),'YYYYMMDD') < TRUNC(SYSDATE) - 10;
我也尝试在Sysdate-10周围放置一个带有适当掩码的TO_DATE,但仍然会收到错误。任何见解?谢谢!
答案 0 :(得分:2)
我在SQL Server中看到了类似的东西,这是因为WHERE
表达式不一定按顺序进行评估。这意味着其他分区正在通过日期算术逻辑 - 并导致失败。
CASE
保证评估顺序。这有用吗?
SELECT COUNT(*)
FROM dba_tab_partitions
WHERE table_owner = 'myId' AND
(CASE WHEN table_owner = 'myId'
THEN TO_DATE(SUBSTR(partition_name, INSTR(partition_name, '_', 1, 2) + 1), 'YYYYMMDD')
END) < TRUNC(SYSDATE) - 10;
或者这个版本:
SELECT COUNT(*)
FROM dba_tab_partitions
WHERE table_owner = 'myId' AND
(CASE WHEN regexp_like(partition_name, '[^_]*_[^_*]_[0-9]{8}$'
THEN TO_DATE(SUBSTR(partition_name, INSTR(partition_name, '_', 1, 2) + 1), 'YYYYMMDD')
END) < TRUNC(SYSDATE) - 10;