【问题标题】:SQL interval with subqueries带有子查询的 SQL 间隔
【发布时间】:2020-12-25 14:36:28
【问题描述】:

我想过滤某个日期的旧记录,但此 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;

【问题讨论】:

  • 您使用的是 MS SQL Server 还是 Oracle?它们的日期/时间功能非常不同。
  • 我正在使用 oracle

标签: sql oracle datetime subquery intervals


【解决方案1】:

任意使用

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

【讨论】:

    【解决方案2】:

    你可以这样试试:

    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

    【讨论】:

      【解决方案3】:

      你可以这样写:

      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'
      )
      

      请注意,如果table2 中有不止一行的name'Tmp',这将失败。

      【讨论】:

      • 是的,我在 table2 中有不止一行
      • 我不喜欢混合使用 DATEINTERVAL 类型。使用TIMESTAMP(即SYSTIMESTAMP)和INTERVALDATE和数字(即天数)。您可以混合使用它们,但是当您不熟悉隐式转换时,结果可能与预期不同。
      • @WernfriedDomscheit:谢谢,这是一个很好的观点。我更新了我的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-21
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多