导致此日期比较错误的原因是什么?

时间:2017-10-02 15:06:48

标签: oracle oracle12c

我一直在努力理解为什么这个查询不起作用。此所有者的所有分区名称都具有“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,但仍然会收到错误。任何见解?谢谢!

1 个答案:

答案 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;