2013-07-26 55 views
-1
SELECT * 
    FROM orders do 
WHERE (CASE TO_CHAR(sysdate,'D') 
     WHEN '1' THEN do.create_date=sysdate 
     WHEN '2' THEN do.create_date BETWEEN sysdate-1 AND sysdate 
     WHEN '3' THEN do.create_date BETWEEN sysdate-2 AND sysdate 
     WHEN '4' THEN do.create_date BETWEEN sysdate-3 AND sysdate 
     WHEN '5' THEN do.create_date BETWEEN sysdate-4 AND sysdate 
     WHEN '6' THEN do.create_date BETWEEN sysdate-5 AND sysdate 
     WHEN '7' THEN do.create_date BETWEEN sysdate-6 AND sysdate 
     END) 

這有什麼問題?我收到以下錯誤消息帶條件語法的where子句中的日期類型

Error Msg : 
ORA-00905: missing keyword 
00905. 00000 - "missing keyword" 
*Cause:  
*Action: 
Error at Line: 46 Column: 37 
+2

歡迎堆棧溢出。請儘快閱讀[關於]頁面。請注意,您的錯誤消息提到第46行,但您的SQL不會延伸到第46行。發生這種情況時,您應該確定哪一行是第46行。另外,一般來說,當您詢問SQL問題時,值得指定哪些DBMS你正在使用 - 不同的DBMS之間有很多不同(即使這個問題是關於基本的SQL)。最後(這不是你陷入的陷阱),請記住給你的表名 - 令人驚訝的問題是'我有這個(_anonymous_)'表具有以下模式'。 –

回答

1

where語句返回一個值,而不是布爾值。也就是說,betweenwhen子句中沒有意義。

這裏是表達狀態的另一種方式:

select * 
from orders do 
where do.created_date between sysdate - (cast(to_char(sysdate,'D') as int) - 1) and sysdate; 

如果你想與between要做到這一點,這將是這樣的:

select * 
from orders do 
where do.create_date between s 
      (case to_char(sysdate,'D') 
       WHEN '1' THEN sysdate 
       WHEN '2' THEN sysdate-1 
       WHEN '3' THEN sysdate-2 
       WHEN '4' THEN sysdate-3 
       WHEN '5' THEN sysdate-4 
       WHEN '6' THEN sysdate-5 
       WHEN '7' THEN sysdate-6 
      END) and sysdate; 
+0

我認爲你需要'(CAST(TO_CHAR(SYSDATE,'D')AS INT) - 1)'以避免一個錯誤的錯誤......否則,更加緊湊。 –

+0

@JonathanLeffler。 。 。謝謝。修正了。 –