2014-01-09 84 views
0

我正在航空環境中工作,我必須比較兩個值。其所有智慧中的OEM已將所有日期時間值存儲在char中。要比較的值稱爲aibt和sibt 作爲where子句的一部分,我需要檢查aibt是否大於sibt。所以這是我做過什麼:如何根據日期和時間比較Oracle中的兩個日期值

To_Date(aibt,'YYYYMMDDHH24MISS') > To_Date(sibt,'YYYYMMDDHH24MISS') 

當應用TO_DATE,原來char值轉換爲:2013年12月25日12時五十四分00秒

,但我得到了以下錯誤:

ORA -01841:(全)年必須介於-4713和+9999之間,而不是0

+4

你能告訴我們原始值嗎?我想當它是25.12.2013 12:54:00,格式不反映文本的價值。 –

+0

如果您可以向我們展示一些示例數據,我們可以指出'to_date'函數出錯的地方。 – Rachcha

+0

向我們展示了'從雙重選擇aibt的結果;' – SriniV

回答

1

似乎是數據中的錯誤。先試試:

Select to_date(aibt,'YYYYMMDDHH24MISS') from your_table 

Select to_date(sibt,'YYYYMMDDHH24MISS') from your_table 

檢查您的列中是否有一些不正確的數據。

當您在列標識您的問題的數據,你會發現一個與事端這樣搞亂這個備份數據:

select * 
    from yourtable 
where not regexp_like(aibdt, '^[[:digit:]]+$') 
    OR length(aibdt)<4 OR 
    substr(aibdt,1,4)<0 
1

你顯然有一些數據,不能與TO_DATE轉換爲適當的日期。請隨意指責您的OEM未定義約束條件或以其他方式防止發生這種情況。

雖然他都繞來解決他的問題,你可以使用它作爲一個解決辦法:

WHERE aibt > sibt 
0

有沒有在數據中的一些問題。也感謝Twinkles的貢獻。我沒有想到這一點。任何人都可以解釋如何比較兩個char值的工作? 我在另一篇文章Oracle: how to add minutes to a timestamp?我用於構造比較答案(我真正需要的):

WHERE TO_DATE(AIBT, 'YYYYMMDDHH24MISS')> TO_DATE(SIBT, 'YYYYMMDDHH24MISS')+間隔「 15'分鐘

謝謝大家!