2015-10-16 48 views
1

得到所有記錄我有這樣的查詢:SQL甲骨文聯合查詢,從今天

SELECT contact.PUBID, 
    contact.LASTNAME, 
    contact.FIRSTNAME, 
    contact.MIDDLENAME, 
    contact.CELLPHONE, 
    doc.PUBID, 
    doc.ISSUER, 
    doc.ISSUEDATE, 
    doc.SERIES, 
    doc.DOCNUMBER 
FROM CONTACT contact 
INNER JOIN DOCUMENT doc 
ON contact.PUBLICID = 'ab12' 
WHERE TRUNC(SYSDATE); 

我想從今天的所有記錄,但有一個錯誤:

ORA-00920: wrong relational operator 
00920. 00000 - "invalid relational operator" 
*Cause:  
*Action: 
Error at Line: 3 Column: 143 

你能幫助我爲什麼?

回答

0

WHERE TRUNC(SYSDATE);

這是一個不完整的條件。 WHERE子句用於根據條件過濾行。

WHERE table.column = TRUNC(SYSDATE) 

此外,要知道日期時間的。當您在SYSDATE上使用TRUNC時,它將截斷時間部分,但是,如果您在日期列中有時間部分,則它將與TRUNC(SYSDATE)不匹配。

您需要在兩邊申請TRUNC

WHERE TRUNC(table.column) = TRUNC(SYSDATE) 

但上面沒有但從性能好點。如果您在日期列中有常規的B *樹索引,則由於TRUNC函數,將會忽略

這是更好地使用DATE範圍條件

WHERE date_column 
BETWEEN 
     TRUNC(SYSDATE) 
AND  
     TRUNC(SYSDATE) +1 
1

WHERE子句中,您必須爲過濾行指定一些CONDITION。

例如:

WHERE trunc(start_date) = trunc(SYSDATE) 

這裏起始日期 - 列從表中,DATE數據類型。

所以你需要決定,今天應該是哪一列。

順便說一下,你的加入情況也有點怪。你產生笛卡爾連接。你確定這是你想要的嗎?......

+0

「* WHERE TRUNC(起始)= TRUNC(SYSDATE)*」 將忽略'start_date'索引。最好使用日期範圍條件來使用常規索引掃描。否則,使用基於函數的索引。我更喜歡日期範圍。 –

+0

@LalitKumarB我不確定作者是否詢問WHERE TRUNC(sysdate)知道索引...但是好的,你已經把它寫在你的回答中 – Tatiana

+0

我的觀點是,既然你已經建議'TRUNC(start_date') ,提及利弊總是很好的。 –