2015-08-28 68 views
-1

其表我想當前時間

CREATE TABLE TOY_STORE 
(
    TOY_STORE_ID  NUMBER(3)  PRIMARY KEY, 
    TOY_STORE_NAME  VARCHAR2(30) NOT NULL, 
    CITY    VARCHAR2(30) DEFAULT 'Delhi', 
    PHONENUMBER   NUMBER(10)  UNIQUE NOT NULL, 
    STORE_OPENING_TIME TIMESTAMP  CHECK (EXTRACT(HOUR FROM STORE_OPENING_TIME)>=8), 
    STORE_CLOSING_TIME TIMESTAMP  CHECK(EXTRACT(HOUR FROM STORE_CLOSING_TIME)<22) 
); 

並且在下面的代碼中的一些問題之前至少兩小時,以顯示存儲已打開。任何人都可以糾正它plz

SELECT TOY_STORE_NAME 
FROM TOY_STORE 
WHERE 
(
    SELECT EXTRACT (HOUR FROM CURRENT_TIMESTAMP-STORE_OPENING_TIME) 
    FROM TOY_STORE 
)>=2; 
+0

您遇到什麼問題?如果你要編輯你的問題幷包括一些樣本數據,你得到的結果和你的預期結果,這將會很有幫助。謝謝。 –

回答

0

要比較兩個日期/時間值之間的差異,我們使用INTERVAL數據類型。因此,您的查詢可能如下所示:

select TOY_STORE_NAME 
from TOY_STORE 
where (localtimestamp - STORE_OPENING_TIME) >= interval '2' hour 
/

當然這是錯誤的。因爲STORE_OPENING_TIME是timestamp它包含日期。所以你已經正確地指出你需要從時間戳中提取小時元素。障礙在於你需要將它轉換爲一個間隔。我們可以使用NUMTODSINTERVAL()

所以,要找到它已經打開至少兩個小時的商店,你需要的是這樣的

select TOY_STORE_NAME 
from TOY_STORE 
where NUMTODSINTERVAL(extract(hour from CURRENT_TIMESTAMP), 'Hour') 
     >= NUMTODSINTERVAL(extract(hour from STORE_OPENING_TIME)+2, 'Hour') 
/

現在我們必須在WHERE子句兩側間隔。

請注意,使用TIMESTAMP代表沒有日期的時間會在某些時候導致問題,因爲意圖很容易被誤解。更好的解決方案是將時間存儲爲字符串,例如'HH24:MI',並使用日期算法來處理它。例如,

select TOY_STORE_NAME 
from TOY_STORE 
where to_date(to_char(sysdate, 'DD-MON-YYYY')||' '||STORE_OPENING_TIME, 'DD-MON-YYYY HH24:MI') 
       + NUMTODSINTERVAL(2, 'Hour') >= sysdate 
/

我同意它看起來很醜,但它可以包裹在用戶定義的函數中。

如果Oracle SQL有一個TIME數據類型(即沒有日期元素),但是可惜它沒有,這種痛苦會被避免。

0

在這裏,首先您可以通過trunc()從時間戳字段中檢索時間。然後比較時間差和2小時的時間間隔將幫助您檢索當前時間前至少2小時開放的商店名稱。

select TOY_STORE_NAME 
from TOY_STORE  
where (CURRENT_TIMESTAMP-trunc(CURRENT_TIMESTAMP)) - (STORE_OPENING_TIME-trunc(STORE_OPENING_TIME)) >= interval '2' hour;