2011-08-29 39 views
1

下面是一个简单的查询:无益Oracle错误信息:有望%S,拿到%S使用TO_DATE

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函数,它也能工作。

+0

什么类型是'data_submitted'列? – skaffman

+0

你是对的。这是一个NUMBER(10,0)。有任何解决这个问题的方法吗?您必须能够将其转换为Oracle中的日期吗?它是一个整数,从1970年的秒数或类似的东西... – ale

+0

我不认为甲骨文提供任何方式来将millis值转换为'DATE'。你将不得不自己转换该表。为什么您将它作为NUMERIC存储起始? – skaffman

回答

4

转换甲骨文日期以Unix时间戳值需要具备以下功能:

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

或在您的SQL的情况下,where子句:

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)) 
5

它看起来像date_submitted列是数字,你试图比较它与日期。 Oracle不会让你这样做。

[编辑:]假设Epoch是1970年1月1日,你应该能够使用:

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

要获得表示实际日期。我不确定这是否100%准确,因为你在几秒内的日期可能不包括闰秒和甲骨文的可能。

+0

你说得对。这是一个NUMBER(10,0)。有任何解决这个问题的方法吗?您必须能够将其转换为Oracle中的日期吗?它是一个整数,从1970年的秒数或类似的东西...... – ale