Сравнение типа данных Oracle Interval - PullRequest
1 голос
/ 02 июля 2010

У меня есть интервал времени оракула в операторе выбора, подобный следующему:

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

Это происходит с ошибочным типом данных.Поэтому я попробовал это, и это все еще не удается.

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

Можно ли сравнить типы интервалов?

Ответы [ 5 ]

2 голосов
/ 02 июля 2010

В вашем вопросе упоминается тип данных 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>

Сравнение разницы между двумя датами и интерваломcinch ...

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>

Короче говоря, трудно понять, что вы делаете, чтобы получить ошибку.Поэтому вам нужно отредактировать свой вопрос и предоставить более подробную информацию.Опишите таблицу.Предоставьте пример данных.Кроме того, дайте нам полное сообщение об ошибке.

1 голос
/ 02 июля 2010

В предположении я бы сказал, что ваши столбцы TIMESTAMP с. Когда вы вычитаете два DATE с, в результате получается NUMBER; когда вы вычитаете два TIMESTAMP с, в результате получается INTERVAL. Чтобы исправить второй запрос, замените SYSDATE на SYSTIMESTAMP:

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

Однако вам лучше использовать TO_DSINTERVAL, как уже было предложено.

1 голос
/ 02 июля 2010

Если вы выполняете арифметику для типов 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
1 голос
/ 02 июля 2010

Если я выполню следующее в своей базе данных 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

Что еще вы делаете в этом утверждении?

0 голосов
/ 02 июля 2010

Я обнаружил, когда я добавил day to second, оно превратило второе значение в интервал, и это сработало. Спасибо всем за идеи.

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