2017-01-30 65 views
0

我正在嘗試在Oracle SQL Developer中構建一個查詢,該查詢將返回不在營業時間內(08:00 am-5:00PM)的小時數以清除它。 該列名爲auction_time。問題在於表格包含200萬行和諸如'9:45 am','9 am','11:00:00','23:00'等幾種格式。 我已經嘗試過類似的,但它也返回其他類型的結果 select * from all_foreclosures where '17%'和'24%'之間的auction_time; 你能幫忙嗎?如何查找無效時間

+0

什麼是該領域的佈局? nvarchar,datetime,varchar,...? – Svekke

+0

VARCHAR2(16 BYTE) – Nucu

+0

不幸的是,這聽起來像是幾乎不可能做到的事情,因爲在列本身沒有直接的格式。 – Svekke

回答

0

您可以使用CASE語句和多個正則表達式匹配不同的格式(你需要找出所有不同的格式):

SELECT * 
FROM (
    SELECT t.*, 
     (CASE 
      WHEN REGEXP_LIKE(auction_time, '^\s*(0?[1-9]|1[0-2])\s*[ap]m\s*$', 'i') 
      THEN TO_DATE(auction_time, 'HH12AM') 
      WHEN REGEXP_LIKE(auction_time, '^\s*(0?[1-9]|1[0-2]):[0-5]?\d\s*[ap]m\s*$','i') 
      THEN TO_DATE(auction_time, 'HH12:MIAM') 
      WHEN REGEXP_LIKE(auction_time, '^\s*([01]?\d|2[0-3]):[0-5]?\d\s*$') 
      THEN TO_DATE(auction_time, 'HH24:MI') 
      WHEN REGEXP_LIKE(auction_time, '^\s*([01]?\d|2[0-3]):[0-5]?\d:[0-5]?\d\s*$') 
      THEN TO_DATE(auction_time, 'HH24:MI:SS') 
     END 
     - TRUNC(SYSDATE, 'Y') 
     ) * 24 AS Hours 
    FROM your_table t 
) 
WHERE hours < 8 OR hours > 17 
+0

謝謝,上面的查詢是一個非常好的開始。 – Nucu