【问题标题】:Comparing the Oracle Interval Data Type比较 Oracle 间隔数据类型
【发布时间】:2011-03-11 03:28:54
【问题描述】:

我在这样的 select 语句中有一个 oracle 时间间隔:

SELECT ...
    CASE WHEN date1 - date2 > 0 
    THEN 'No'
    ELSE 'YES'
END 

这会因数据类型无效而失败。所以我尝试了这个,它仍然失败。

SELECT ...
    CASE WHEN date1 - date2 > (sysdate - sysdate) 
    THEN 'No'
    ELSE 'YES'
END 

有什么方法可以比较区间类型吗?

【问题讨论】:

    标签: sql oracle intervals date-arithmetic select-case


    【解决方案1】:

    您的问题提到了 INTERVAL 数据类型,尽管从您的示例中不清楚发生在哪里或是否发生这种情况。日期和间隔的算术非常简单;

    SQL> select d1
      2         , d2
      3         , case when d2  > d1 + to_dsinterval ('10 0:0:0')
      4                 then 'no'
      5                 else 'yes' end
      6  from t34
      7  /
    
    D1        D2        CAS
    --------- --------- ---
    02-JUL-10 25-JUN-10 yes
    02-JUL-10 24-AUG-10 no
    02-JUL-10 26-MAY-10 yes
    02-JUL-10 25-JUL-10 no
    02-JUL-10 15-APR-09 yes
    02-JUL-10 13-JUL-10 no
    
    6 rows selected.
    
    SQL>
    

    当两列都是 INTERVAL 数据类型时,算术显然有效:

    SQL> select intvl1
      2         , intvl2
      3         , case when intvl2  > intvl1
      4                 then 'no'
      5                 else 'yes' end
      6  from t34
      7  /
    
    INTVL1               INTVL2               CAS
    -------------------- -------------------- ---
    +10 00:00:00.000000  +07 00:00:00.000000  yes
    +10 00:00:00.000000  -53 00:00:00.000000  yes
    +10 00:00:00.000000  +37 00:00:00.000000  no
    +10 00:00:00.000000  -23 00:00:00.000000  yes
    +10 00:00:00.000000  +78 00:00:00.000000  no
    +10 00:00:00.000000  -11 00:00:00.000000  yes
    
    6 rows selected.
    
    SQL>
    

    比较两个日期和间隔之间的差异很容易......

    SQL> select d1
      2         , d2
      3         , intvl1
      4         , case when  numtodsinterval(d1-d2, 'DAY') > intvl1
      5                 then 'no'
      6                 else 'yes' end
      7  from t34
      8  /
    
    D1        D2        INTVL1               CAS
    --------- --------- -------------------- ---
    02-JUL-10 25-JUN-10 +10 00:00:00.000000  yes
    02-JUL-10 24-AUG-10 +10 00:00:00.000000  yes
    02-JUL-10 26-MAY-10 +10 00:00:00.000000  no
    02-JUL-10 25-JUL-10 +10 00:00:00.000000  yes
    02-JUL-10 15-APR-10 +10 00:00:00.000000  no
    02-JUL-10 13-JUL-10 +10 00:00:00.000000  yes
    
    6 rows selected.
    
    SQL>
    

    简而言之,很难理解您正在做什么以得到错误。因此,您需要编辑您的问题并提供更多详细信息。描述表。提供一些样本数据。另外,请给我们完整的错误信息。

    【讨论】:

      【解决方案2】:

      如果我在我的 10g 数据库上执行以下操作,一切正常:

      SQL> create table temptbl (d1 date, d2 date);
      
      Table created
      
      SQL> insert into temptbl values (sysdate, sysdate-1/12);
      
      1 row inserted
      
      SQL> insert into temptbl values (sysdate, sysdate+1/12);
      
      1 row inserted
      
      SQL> SELECT CASE WHEN d1 - d2 > 0 THEN 'No' ELSE 'YES' END result FROM temptbl;
      
      RESULT
      ------
      No
      YES
      

      你在这个声明中还做了什么?

      【讨论】:

        【解决方案3】:

        如果您对 INTERVAL DAY TO SECOND 类型执行算术运算,则需要将其与另一个 INTERVAL DAY TO SECOND 列进行比较。

        SQL> SELECT
          2         CASE when (NUMTODSINTERVAL(1, 'DAY') - NUMTODSINTERVAL (1, 'HOUR')) 
                                > (numtodsinterval(0, 'day'))
          3              then 1
          4              else 0
          5         end as expression
          6*  from dual
        med_audit@AGDEV:SQL> /
        
        EXPRESSION
        ----------
                 1
        

        【讨论】:

          【解决方案4】:

          我猜你的专栏是TIMESTAMPs。当你减去两个DATEs,结果是一个NUMBER;当您减去两个TIMESTAMPs 时,结果是INTERVAL。要修复您的第二个查询,请将 SYSDATE 替换为 SYSTIMESTAMP

          SELECT ...
              CASE WHEN date1 - date2 > (systimestamp - systimestamp) 
              THEN 'No'
              ELSE 'YES'
          END 
          ...
          

          但是,您最好使用TO_DSINTERVAL,正如已经建议的那样。

          【讨论】:

            【解决方案5】:

            我发现当我添加day to second 时,它会将第二个值变成一个区间并且它起作用了。谢谢大家的想法。

            SELECT ...
                CASE WHEN date1 - date2 > (sysdate - sysdate) day to second
                THEN 'No'
                ELSE 'YES'
            END 
            

            【讨论】:

            • 我们可以对问题的答案进行投票。 15 分的限制是对其他人的问题的回答进行投票。
            • 不,它不会让我。 :-(
            • 不是一个真正有用的答案。我们不知道列的数据类型我不认为这对找到问题的人有用
            猜你喜欢
            • 2010-12-23
            • 2013-10-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-13
            • 2014-04-26
            • 2015-04-03
            相关资源
            最近更新 更多