1

我在这样的 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 

有没有办法比较区间类型?

4

5 回答 5

2

您的问题提到了 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>

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

于 2010-07-02T14:57:28.723 回答
1

如果我在我的 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

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

于 2010-07-02T14:57:29.330 回答
1

如果您在 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
于 2010-07-02T15:15:34.993 回答
1

猜测一下,我会说您的列是TIMESTAMPs。当你减去两个DATEs 时,结果是 a NUMBER; 当你减去两个TIMESTAMPs 时,结果是一个INTERVAL. 要修复您的第二个查询,请替换SYSDATESYSTIMESTAMP

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

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

于 2010-07-02T16:16:49.823 回答
-1

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

SELECT ...
    CASE WHEN date1 - date2 > (sysdate - sysdate) day to second
    THEN 'No'
    ELSE 'YES'
END 
于 2010-07-02T16:29:32.143 回答