2011-07-29 56 views
1

我正在使用LINQ-to-SQL並需要按日期字段進行排序。日期字段以文本形式存儲,並且可以包含任何內容,因爲它是用戶輸入的數據。我需要處理無效日期放在那裏的情況。
例如,「02/23/0000」返回日期:LINQ轉換日期,需要處理不好的日期

varchar數據類型爲datetime數據類型的轉換導致外的範圍內的值。

我需要避免錯誤,我不在乎這樣的無效日期得到排序。該項目的參數意味着我無法修改我的源數據,只能從中讀取。
這裏是一個LINQ語句的例子。

from x in dbo_myTable 
orderby Convert.ToDateTime(x.MyDateField) 
select x 
+1

這就是爲什麼你不把日期存儲在varchar字段! – Jamiec

+0

我認爲最大的問題是「日期字段以文本形式存儲,並且可能包含任何內容,因爲它是用戶輸入的數據」...爲什麼您不使用正確的數據類型並驗證輸入,因此人們無法東西垃圾到你的數據庫?要做到這一點的最簡單方法是在那裏有一百萬個免費的日曆控件。除此之外,你可以使用ISDATE()過濾你的數據,但這就像在霰彈槍傷口上使用創可貼。 –

+0

如果與數據有一定的一致性,則可能會有解決方法。所有日期字符串都是10個字符? 格式化爲「DD/DD/DDDD」? D - 數字? – Aducci

回答

0

你可以做這樣的事情(根據您的評論他們都是10個字符)

from x in dbo_myTable 
orderby x.MyDateField.Substring(6, 4), x.MyDateField.Substring(0, 2), x.MyDateField.Substring(3, 2) 
select x 
+0

因爲這是一個尷尬的解決方案。我認爲這是我必須去的。謝謝! – VenerableAgents

1

絕對需要在數據庫中執行的順序?在這種情況下,我會強烈考慮提取所有數據,然後在.NET代碼中進行一些轉換,以便更好地控制發生的情況,然後以.NET代碼的形式對其進行排序。

最終,在這種情況下處理搞砸的數據是棘手的 - 控制越多越好。

+0

是的,它必須在這裏。我正在使用一種環境,我只能指定LINQ查詢,並且軟件將這個查詢填充到另一個服務器上並填充表。 – VenerableAgents

+1

如果你最終填充表格,那麼爲什麼訂單很重要?您知道選擇查詢的順序不能保證與數據存儲在目標表中的順序相同,對嗎? –

+0

這有點複雜。我運行同一個LINQ查詢兩次,所以我可以填充兩個單獨的表,但也有一個函數在其中一個字段上運行,以處理不允許重複的字段上的重複項,所以我需要它以便表格獲得該字段的相同值。此外,它進入表並獲得一個新的ID,所以我希望它是在它最初輸入的順序(這意味着按日期字段排序) – VenerableAgents

0

首先是第一個; 爲什麼你不能改變數據庫來修復你顯然打破了表結構?爲什麼不能在輸入數據庫時​​對輸入進行清理?爲什麼你不驗證用戶輸入?

現在尋求答案;你唯一的選擇是試圖解析日期(用DateTime.TryParse或DateTime.TryParseExact),並設置您選擇的默認值,如果它不能解析:

from x in dbo_myTable 
orderby TryConvertToDateTime(x.MyDateField) 
select x 

private DateTime TryConvertToDateTime(string dt) 
{ 
    DateTime rtn = DateTime.MinValue; // or whatever you want your default to be 
    DateTime.TryParse(dt,out rtn); 
    return rtn; 
} 
+1

雖然不會轉換成SQL(通過LINQ),但... –

+0

在回答爲什麼:這是歷史數據,只是碰巧沒有在那個時候對用戶輸入進行了任何驗證。 – VenerableAgents

+0

感謝Jon,我想說,這對我不起作用。我需要一個純粹的LINQ解決方案。 – VenerableAgents