2010-07-02 2 views
1

У меня есть временный интервал оракула в операторе отбора, как это:Сравнение типа Oracle Data Interval

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

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

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

Есть ли способ сравнить интервальные типы?

ответ

-1

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

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

Мы можем проголосовать за ответы на наши вопросы. Предел в 15 пунктов - это ответ на ответы * на вопросы других людей. – APC

+0

Нет, это не позволило мне. :-( – jeffspost

+0

Но я могу голосовать сейчас. :-) – jeffspost

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> 

Когда оба столбца интервального типа данных, арифметика явно работает:

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> 

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

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 

Что еще вы делаете в этом заявлении?

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 
[email protected]:SQL>/

EXPRESSION 
---------- 
     1 
1

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

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

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