2015-09-10 48 views
0

所以我正在一個實習生所做的網站上工作,我們在DataTable中有一個日期列,但它只是一個字符串,所以在做dt.DefaultView.Sort = "DATE ASC"時它排序很奇怪,這裏是一個例子。Sort DataTable String

Date: 
01/31/2015 
02/10/2015 
02/15/2015 
02/15/2014 
02/20/2015 
02/20/2014 
02/21/2014 

你可以通過這個看到,它是由前兩個MM/DD但今年分揀混合到這​​一點,所以我們有2014和日期與2015年等。我需要首先在今年再排序由另外兩個。自日期以來如何做到這一點的任何想法只是一個字符串?

+0

什麼數據類型有'DATE'字段? – Marusyk

+0

將字符串轉換爲與此問題類似的實際'DateTime',然後排序? http://stackoverflow.com/questions/919244/converting-a-string-to-datetime –

回答

1

我想補充一個新列具有DateTime類型DataTable並按此分類。這樣你就可以得到「真正的」日期排序。如果您可以編輯加載數據到DataTable返回日期SQL過程,這將是最好的,但除此之外,你能做到這一點代碼:

var dt = GetMyDataTable(); //however you're loading the table 
dt.Columns.Add("MyDate", typeof (DateTime)); 
foreach (DataRow row in dt.Rows) 
{ 
    row["MyDate"] = DateTime.Parse(row["MyStringDate"].ToString()); 
} 
dt.DefaultView.Sort = "MyDate ASC"; 

請注意,如果你有很多的行,這可能不是要走的路,更好的方法是修改程序以將日期返回爲DateTime

0

您將該列命令定義爲字符串。將該列作爲日期或使用格式YYYY-MM-DD來訂購該列。

0

我不知道它會工作,但嘗試添加cast因爲你DATEvarchar類型和分類爲字符串:

dt.DefaultView.Sort = "CAST(DATE as Date) ASC" 
+0

如果你不確定它是否會工作,它應該是一個評論,而不是回答。 –

0

如果你想/可以使用LINQ那麼這應該工作:

var sortedDataTable = 
    (from row in yourDataTable.AsEnumerable() 
    let correctDate= Convert.ToDateTime(row.Field<string>("DATE"))  
    orderby correctDate 
    select row).CopyToDataTable(); 
0

有關將列表達式如何?

table.Columns.Add(new DataColumn("YMD") { 
    Expression = "SUBSTRING(Date,7,4)+SUBSTRING(Date,1,2)+SUBSTRING(Date,4,2)" 
}); 
var view = table.DefaultView; 
view.Sort = "YMD";