带子查询的SQL间隔

问题描述

我要过滤器记录某个日期的旧记录,并且此sql无法正常工作:

SELECT * 
FROM TABLE1 
WHERE UPDATED_ON + INTERVAL (SELECT B.DAYS FROM B.TABLE2 
                             WHERE B.NAME = 'Tmp') DAY < SYSDATE;

但是此sql之所以有效,是因为“”中的常数为2。我该如何使用子查询代替常量?

SELECT * 
FROM TABLE1 
WHERE UPDATED_ON + INTERVAL '2' DAY < SYSDATE;

解决方法

可以使用

WHERE
   UPDATED_ON 
      + (SELECT B.DAYS FROM B.TABLE2 WHERE B.NAME = 'Tmp') * INTERVAL '1' DAY < SYSTIMESTAMP

WHERE
   UPDATED_ON 
      + NUMTODSINTERVAL((SELECT B.DAYS FROM B.TABLE2 WHERE B.NAME = 'Tmp'),'day') < SYSTIMESTAMP

WHERE
   UPDATED_ON 
      + (SELECT B.DAYS FROM B.TABLE2 WHERE B.NAME = 'Tmp') < SYSDATE
,

您可以这样写:

select t1.*
from table1 t1
where updated_on < (
    select systimestamp - t2.days * interval '1' day from table2 t2 where t2.name = 'Tmp'
)

或者,如果updated_ondate而不是timestamp

select t1.*
from table1 t1
where updated_on < (
    select sysdate - t2.days from table2 t2 where t2.name = 'Tmp'
)

请注意,如果table2name'Tmp'的行超过一个,则此操作将失败。

,

您可以这样尝试:

select UPDATED_ON,UPDATED_ON  +  (SELECT t2.DAYS FROM TABLE2 t2 WHERE t2.NAME = 'Tmp') 
FROM TABLE1 
WHERE UPDATED_ON +  (SELECT t2.DAYS FROM TABLE2 t2 WHERE t2.NAME = 'Tmp')  < SYSDATE;

这是一个演示:

DEMO