Бесполезное сообщение об ошибке Oracle: ожидается% s, получено% s с использованием to_date - PullRequest
1 голос
/ 29 августа 2011

Вот простой запрос:

SELECT COUNT(*) FROM m_bug_t 
WHERE date_submitted BETWEEN TO_DATE('2011-08-22','yyyy-mm-dd') AND TO_DATE('2011-08-29','yyyy-mm-dd') 
AND status != 100

, которое выдает следующее сообщение об ошибке

ORA-00932: inconsistent datatypes: expected NUMBER got DATE
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:    
*Action:
Error at Line: 2 Column: 22

Есть идеи? Я использую MySQL, где это работает даже без функции to_date.

Ответы [ 2 ]

5 голосов
/ 29 августа 2011

Похоже, что столбец date_submitted числовой, и вы пытаетесь сравнить его с датой. Oracle не позволит вам сделать это.

[ EDIT :] Предполагая, что Epoch - 1 января 1970 года, вы должны иметь возможность использовать:

TO_DATE('01/01/1970 00:00:00', 'MM-DD-YYYY HH24:MI:SS') + (date_submitted / (24 * 60 * 60))

Чтобы получить фактическую дату, которая представлена. Я не уверен, будет ли это на 100% точным, поскольку ваша дата в секундах может не включать високосные секунды, и, скорее всего, Oracle это делает.

4 голосов
/ 29 августа 2011

Для преобразования дат Oracle в значения меток времени Unix требуется следующая функция:

SELECT (sysdate - to_date('01-JAN-1970','DD-MON-YYYY')) * (86400) as dt FROM dual; 

или в случае вашего sql где пункт:

WHERE date_submitted between 
    ((TO_DATE('2011-08-22', 'yyyy-mm-dd') - to_date('01-JAN-1970','DD-MON-YYYY')) * (86400))
AND 
    ((TO_DATE('2011-08-29', 'yyyy-mm-dd') - to_date('01-JAN-1970','DD-MON-YYYY')) * (86400))
...