2011-12-07 84 views
0

我正在使用Oracle 10g數據庫中的一些數據,特別是批量更新和讀取時間戳記信息。由於業務需求,我必須將MM/DD/YYYY HH24:MI:SS格式轉換爲YYYY-MM-DD HH24:MI:SS格式。另外,由於業務需求,時間戳存儲爲VARCHAR而不是本機日期時間。在Oracle 10g中查找錯誤的日期時間標記

不幸的是,現在我遇到了麻煩在我的數據上運行選擇操作。

具體而言,當我運行下面的選擇,我收到ORA-01861:那不好的說法是TO_DATE(datetime_stamp,「YYYY-MM-DD HH24

SELECT datetime_stamp 
    from entrytable 
where 
    to_date(datetime_stamp, 'YYYY-MM-DD HH24:MI:SS') 
    between 
    TO_DATE('11/27/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS') 
    and 
    TO_DATE('12/06/2011 23:59:59', 'MM/DD/YYYY HH24:MI:SS') 
    and rownum < 1000 

我證實:文字不匹配格式字符串:MI:SS'),但是現在我有400k行數據要解析,試圖找到壞行。

有什麼辦法可以讓Oracle返回產生ORA-01861錯誤的行嗎?

我試過使用REGEXP_LIKE來查找不適合的數據[0-9] [0-9] [0-9] [0-9] - [0-9] [0-9] - [ 0-9] [0-9] [0-9] [0-9]:[0-9] [0-9]:[0-9] [0-9],但所有行似乎都適合那個常規表達。

+0

下面的函數應該這樣做。但是,在時間戳/日期數據類型中存儲時間戳/日期會更好。它會爲你省去這個麻煩。 – Ben

+0

希望我能奔...希望我能。 – Gyrfalcon2138

回答

4
create function td(s varchar2) return number is 
begin 
    if to_date(s, 'YYYY-MM-DD HH24:MI:SS') is not null then return 1; end if; 
    return null; 
exception 
    when others then return 0; 
end; 

然後

select datetime_stamp from entrytable where td(datetime_stamp) = 0 
+0

嗨哈爾 - 我試圖複製和粘貼你的代碼到我的Oracle資源管理器中,並得到'ORA-00900:無效的SQL語句;交易被回滾了。'我不確定如何解決問題。我有充分的權利,但我的oracle控制檯有點奇怪 - 例如,我知道它不能很好地處理遊標。你認爲這可能是一個試圖定義函數的問題嗎? – Gyrfalcon2138

+0

嘗試使用SQL Developer或SQL * Plus創建函數 –

+0

+1,'create或replace function'會更好,如果它在SQL * Plus中運行,則在'end;'後面需要'/'。 – Ben

1

時間戳存儲爲VARCHAR,而不是本機的日期時間,由於 業務需求

哇,這樣做的一個可怕的說法。沒有業務需求應該迫使數據庫開發人員使用VARCHAR來存儲日期。這必須來自設計該模式的人的無知或懶惰。如果您不能將日期定義爲日期,那麼它不是日期,而是一串數字和符號,它們可能根據任何格式確定,也可能不符合任何格式。更不用說做任何日期功能,比較等的損失。不好!

無論如何,我會說與項目經理或任何人升級這個問題,並將其優先更改爲日期或時間戳。如果您試圖即時轉換to_date,即使清理了VARCHAR字段,您也會再次遇到這種情況。

嘗試正確地修復它,而不是亂搞清理字符串。

+0

問題是,大多數列都是通用列,可以由系統管理員定義爲某些數據類型。所以這個datetime_stamp列實際上可以是一個整數值,一個字符串或任何東西。我正在按照設計使用產品,並且沒有能力更改數據庫的模式。 – Gyrfalcon2138

+0

ahhhh,停下來,你殺了我......真的。有些「天才」認爲這將是最好的「通用」,所以現在你不知道wtf在那裏。畢竟,數據庫只是我們稱之爲「數據」的「東西」的一個愚蠢的傾銷地。啊。對不起,但它仍然沒有任何藉口讓它向前邁進。祝你好運。 – someuser2

+0

我認爲我們的目標是創建一個可以爲特定客戶定製的產品,而無需每次重建架構。這在某種程度上是有道理的,但我通常是一個MSSQL人員,Oracle似乎很挑剔 - 尤其是關於日期戳。 – Gyrfalcon2138