2010-10-07 79 views
1

您的用戶需要按日期排序的報告。此報告使用C#和ODP.NET創建。 您在日期列上進行排序,輸出結果與用戶預期不完全相同。如何處理存儲在varchar字段中的日期值?

經過仔細檢查,您發現日期列是varchar2字段。 列中的值以DD-MON-YY「01-JAN-10」格式存儲。

如何按日期排序?

我的回答:

select TO_DATE(fakedatecolumn,'DD-MON-YY') from table ORDER BY TO_DATE(fakedatecolumn,'DD-MON-YY') 

有什麼可用的前端?我想DateTime.ParseExact也會做的。

回答

3

你的回答是正確的。排序應該在數據庫級完成。使用DateTime.ParseExact意味着所有行都需要在客戶端獲取,然後進行排序,這可能不是非常有效。一旦結果從數據庫中取出後,您可以將字符串解析爲DateTime,以最終顯示它在用戶界面中的格式。

1

但是,如果任何值都以錯誤的格式存儲,即使該錯誤值在邏輯上不是結果的一部分(因爲Oracle可以按順序評估),您的查詢可能會崩潰。爲了確保安全,您需要創建一個捕獲轉換異常的小型PL/SQL函數。

create or replace function safe_to_date(bad_data_type in varchar2) return date is 
begin 
    return to_date(bad_data_type, 'DD-MON-YYYY'); 
    --What happens if the format is wrong? This just ignores it. 
    exception when others then return null; 
end; 
/

然後,你需要經常使用該功能,而不是TO_DATE的:

select safe_TO_DATE(fakedatecolumn,'DD-MON-YY') 
from table 
ORDER BY safe_TO_DATE(fakedatecolumn,'DD-MON-YY'); 

這很爛,但它是你付出的錯誤存儲你的數據的價格。

+1

感謝您的回覆。我知道有開發者在做這種事情,但我很高興我不是其中之一。日期值應始終存儲在日期列中。 – abhi 2010-10-08 18:24:21

相關問題