使GridView列只包含日期,没有时间,仍然正确排序

时间:2013-02-07 18:12:08

标签: c# asp.net sql

我正在从GridView填充DataTable。我想要显示日期时间字段的日期部分。

我用过:

CONVERT(VARCHAR(10),MyDatetime,103) AS 'DateOnly'

这显示正常,但“错误”排序(它被视为字符串而不是日期) 我想避免的简单解决方案是

CONVERT(VARCHAR(10),MyDatetime,102) AS 'DateOnly'

即。有了第一年,这将正确排序,但不太正确。

我也试过了:

CONVERT(date,MyDatetime,103) AS 'DateOnly' and 
DATEADD(D, 0, DATEDIFF(D, 0, MyDatetime)) AS 'DateOnly'

这些在sql server中看起来很好,但是在日期之后的00:00:00时在GridView添加时进行渲染。 - 从正面看,排序工作正常。

DataTable中的列可能会有所不同,因此列会在运行时生成,我无法使用任何涉及编辑字段的解决方案:

<asp:BoundField DataField="DataFieldName" DataFormatString="{0:d}"></asp:BoundField>

我觉得我差不多就在那里,但我无法找到拼图的最后一块。

2 个答案:

答案 0 :(得分:0)

如果您convert to varchar and order,那么您实际上不是ordering by日期,而是varchar string

要摆脱日期时间,将日期时间转换为日期,您的排序应该没问题(正如您所说)

CONVERT(date, MyDatetime) AS 'DateOnly'

要在gridview上格式化日期(如dd-MM-yyyy),请使用格式字符串,如下所示。请注意,在这种情况下,您的数据绑定字段应为日期类型

<asp:BoundField DataField="DataFieldName" DataFormatString="{0:dd-MM-yyyy}">
</asp:BoundField>

您可以使用sql-server使用CONVERT将日期格式化为特定格式,如MSDN

例如,您可以转换为103样式和订单原始MyDatetime,如下所示

Select col1,col2, convert(varchar,myDateTime,103) as 'DateOnly'
From yourTable
Order by myDateTime

答案 1 :(得分:0)

我终于在RowDataBound上做了这样的事情:stackoverflow.com/questions/4249629/formatting-dynamic-gridview

我确信必须有更好的解决方案,但我找不到它。