2017-01-30 15 views
0

Oracle SQL Developerで、勤務時間外(午前8時〜午後5時)にない時間を返すクエリを作成しようとしています。 列の名前はauction_timeです。問題は、テーブルに200万行と、 '9:45am'、 '9am'、'11:00:00 '、'23:00'などの形式の形式が含まれていることです。 私は好きなように試しましたが、他のタイプの結果も返します。 select * from all_foreclosures auction_timeは'17% 'から'24%'までです。 お手伝いできますか?あなたは、異なるフォーマットに一致するようにCASE文と、複数の正規表現を使用することができます無効な時間の検索方法

+0

フィールドのレイアウトは何ですか? nvarchar、datetime、varchar、...? – Svekke

+0

VARCHAR2(16バイト) – Nucu

+0

残念ながら、これは、列自体には直接的なフォーマットが使用されていないため、ほとんど不可能なようです。 – Svekke

答えて

0

(あなたはすべての異なるフォーマットを指定する必要があります):

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

関連する問題