2013-07-10 101 views
2

GridView中的日期排序無法正常工作。GridView中的日期排序問題

字段名:Lossdate 數據類型:爲nvarchar(255)

在SQL中,數據類型爲nvarchar的,因爲日期欄也有一些格式的字符串值 (如:A90317,A00921這樣)

雖然從數據庫中檢索數據,將數據轉換爲日期格式並將其綁定到網格中。

SELECT name,location,convert(date,lossdate, 101) as LossDate from valuation 

我預期的結果會是這樣

NULL 

NULL 

NULL 

A90118 

A90317 

A00921 

2004-05-27 

2004-10-26 

2010-07-14 

2010-10-05 

2011-04-07 

null應該是第一位的,

格式化字符串日期格式次之,

正確的日期格式應該來在明年排序方式

在gridview中,損失日期是這樣

<asp:BoundField DataField="LossDate" HeaderText="Loss Date" SortExpression="LossDate" 
    dataformatstring="{0:MM/dd/yyyy}" /> 

請幫我解決這個

+0

嘗試編碼使用ORDER BY子句。 –

+0

您的問題是應該是日期的字段的雙重用法,請先嚐試修復。否則,它正確地被排序爲一個字符串,數字在字母之前。如果你不喜歡,你將不得不編寫自己的排序。 – BlackICE

+0

也是如此,除非實際存儲unicode不使用nvarchar數據類型,並且更適當地調整列的大小,從您提供的數據看起來有點大。 – BlackICE

回答

1

你可以試試下面Query如果你想避免在Front-End

select name,location,Lossdate 
    from (select top (select COUNT(*) 
         from valuation 
        where ISDATE(Lossdate) = 0) name,location,Lossdate 
      from valuation 
     Where ISDATE(Lossdate) = 0 
     order by Lossdate) T1 
union all 
select name,location,Lossdate 
    from (select top (select COUNT(*) 
         from valuation 
        where ISDATE(Lossdate) <> 0) name,location,Lossdate 
      from valuation 
     Where ISDATE(Lossdate) <> 0 
     order by convert(date,Lossdate, 120)) T2 
0
var temp = table.AsEnumerable() 
.OrderBy(x => x.Field<string>("LossDate") !=null) 
    .ThenByDescending(p => !DateTime.TryParse(p.Field<string>("LossDate"), out dt)) 
    .ThenBy(x => x.Field<string>("LossDate")); 
var result =temp.AsDataView().ToTable(); 

及以上設置爲girdview的數據源

樣品:

DataTable table = new DataTable(); 
table.Columns.Add("LossDate", typeof(string)); 
table.Rows.Add(new DateTime(2004, 05, 27)); 
table.Rows.Add(DBNull.Value); 
table.Rows.Add("A90317"); 
table.Rows.Add(new DateTime(2009, 06, 27)); 
table.Rows.Add("A90118"); 
table.Rows.Add(DBNull.Value); 
table.Rows.Add("A00921"); 
table.Rows.Add(DBNull.Value); 
table.Rows.Add(new DateTime(2005, 06, 27)); 
DateTime dt; 
var temp = table.AsEnumerable() 
.OrderBy(x => x.Field<string>("LossDate") !=null) 
    .ThenByDescending(p => !DateTime.TryParse(p.Field<string>("LossDate"), out dt)) 
    .ThenBy(x => x.Field<string>("LossDate")); 
var result =temp.AsDataView().ToTable(); 

結果:

LossDate 
null 
null 
null 
A00921 
A90118 
A90317 
27/05/2004 12:00:00 AM 
27/06/2005 12:00:00 AM 
27/06/2009 12:00:00 AM