2011-05-09 16 views
1

我正在尋找一個SQL查詢來從表中提取記錄,對於列值本身中存在的特定日期格式。SQL - 列有DATE,如何將基於「date」的數據作爲行中的一個值獲取?

列使用格式:

num: num1:num2:yyyy-mm-dd hh:mi:ss 

示例值:

1928:52501:290c-1af6-44f2-8e3b-51ca4399 
19282604:080:2901c-12-8b-51 
997494:452:29a1c-1af-44-8e-51c99:2011-01-17 12:36:38 
97494:452050:290c-1a-42-8b-51:2011-04-18 10:36:11 

我們需要獲取僅包含日期的那些行:

997494:452:29a1c-1af-44-8e-51c99:2011-01-17 12:36:38 
97494:452050:290c-1a-42-8b-51:2011-04-18 10:36:11 

回答

1
SELECT * 
FROM the_table 
WHERE to_date(substr(refid, -19), 'yyyy-mm-dd HH24:MI:SS') = TIMESTAMP '2011-01-17 12:36:38' 

當然你不需要使用你的「真實」日期一個簡單的使用

SELECT * 
FROM the_table 
WHERE substr(refid, -19) = '2011-01-17 12:36:38' 

如果你想找到在年底有一個有效日期模式行(而不是有這個日期值「2011-01-17 12時36分38秒」),那麼你需要正則表達式來檢查它:

SELECT * 
FROM the_table 
WHERE regexp_like(refid, '([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2})$') 

注意,這將不會檢查有效日期(將在年底與「2011年2月31日40:50:60」返回行以及)。

+0

嗨......但它只會取結果數據庫中存在特定日期「2011-01-17 12:36:38」。行可以改變爲其他日期,如「2011-04-18 10:36:11」,「2011-03-19 09:11:20」等... – ErAB 2011-05-09 08:47:58

+0

@Ashish:你說*「我想取結果有這個日期值「2011-01-17 12:36:38」*這是這個語句正在做什麼。如果你想根據不同的條件檢索一個日期或行的範圍,你需要提供更詳細的信息向我們展示一些真實的樣本數據(多於一行)以及您期望得到的結果 – 2011-05-09 08:50:41

+0

好的,這裏有一些列「refid」值(用逗號分隔):1928:52501:290c-1af6-44f2- 8e3b-51ca4399,19282604:080:2901c-12-8b-51,9997494:452:29a1c-1af-44-8e-51c99:2011-01-17 12:36:38,97494:452050:290c-1a-42 -8b-51:2011-04-18 10:36:11。所以我需要只提取日期的值。所以我們sql將跳過第一個值,但會考慮最後兩個。 – ErAB 2011-05-09 09:01:48

1

它看起來像一個日行可能會在他們:字符數的基礎上簡單的區分,例如:

SELECT * FROM the_table 
WHERE INSTR(refid, ':', 1, 3) > 0; 

可以然後轉換的日期到Oracle日期:

SELECT TO_DATE(SUBSTR(refid,INSTR(refid,':',1,3)+1) 
       ,'yyyy-mm-dd hh24:mi:ss') 
FROM the_table 
WHERE INSTR(refid,':',1,3) > 0; 

但是,如果任何行的值不能轉換爲日期,查詢將失敗。

爲了解決這個問題,你可以創建一個函數來測試值,例如:

CREATE FUNCTION ref_date (refid IN VARCHAR2) 
RETURN DATE IS 
    d DATE; 
BEGIN 
    d := TO_DATE(SUBSTR(refid,INSTR(refid,':',1,3)+1) 
       ,'yyyy-mm-dd hh24:mi:ss'); 
    RETURN d; 
EXCEPTION 
    WHEN VALUE_ERROR THEN 
    RETURN NULL; 
END; 

現在你可以按如下查詢它:

SELECT ref_date(refid) 
FROM the_table 
WHERE INSTR(refid,':',1,3) > 0 
AND ref_date(refid) IS NOT NULL; 
相關問題