【发布时间】:2009-05-19 21:09:38
【问题描述】:
我有一个数据网格,其中包含从数据库检索的数据,并且数据网格以与数据库中相同的格式显示数据。
其中一列是 DateFrom,这是我要排序的列。 Dateform 以 Varchar 形式存储在数据库中,因此按字母顺序排序,例如 2/2004、2/2008、4/2003。我想将 DatFrom 转换为典型的 DateTime,并在数据网格中显示之前对值进行数字排序。
有什么办法吗?
谢谢
艾因
【问题讨论】:
我有一个数据网格,其中包含从数据库检索的数据,并且数据网格以与数据库中相同的格式显示数据。
其中一列是 DateFrom,这是我要排序的列。 Dateform 以 Varchar 形式存储在数据库中,因此按字母顺序排序,例如 2/2004、2/2008、4/2003。我想将 DatFrom 转换为典型的 DateTime,并在数据网格中显示之前对值进行数字排序。
有什么办法吗?
谢谢
艾因
【问题讨论】:
我创建了一个小演示表(测试)。插入了一些测试日期并进行了选择查询:
Create Table test(dt varchar(10))
Go
Insert Into test(dt)
Select '2/2004'
Union Select '2/2008'
Union Select '4/2003'
Go
Select *
From test
Order By Convert(datetime, '1/' + dt, 103)
【讨论】:
可能包装列以实现 IComparable 接口,以便您可以提供自定义排序,here is an example。
【讨论】:
我想我明白你在这里问什么。如果我不在基地,请告诉我。我认为解决此问题的最简单方法是在 select 语句中从数据库中获取数据,但它可能不一定是 best 方法。这是我想出的:
由于您的“DateFrom”格式为“MM/yyyy”,您将无法直接执行 CAST() 操作。我能想到的获得有效 DATETIME 值的最佳方法是解析当前的 DateFrom 列并将所有日期视为本月的第一天,然后您可以在 datagrid 列上设置“MM/yyyy”的格式,它仍然会正确渲染。 CAST() 语句可能是这样的:
SET DATEFORMAT MDY
SELECT CAST(SUBSTRING(DateFrom, 0, CHARINDEX('/',DateFrom))
+ '/1/'
+ SUBSTRING(DateFrom, CHARINDEX('/',DateFrom) +1, 4) AS DATETIME) AS DateFrom
我知道这不是最优雅的方法,但只要您的日期格式一致,它应该可以工作。祝你好运!
【讨论】:
我不确定我是否理解您的问题。然而,如何在 SQL 端对行进行排序:
SELECT ...
ORDER BY Substring(DateFrom, CHARINDEX('/', DateFrom) + 1, 4)
+ Lpad(DateFrom, 7, '0');
它将原始的 2/1999 更改为 199902/1999,以便可以将其作为字符串进行比较。斜线后面的部分只是因为我不想裁剪字符串,因为它不需要。
或
SELECT ...
ORDER BY Cast(int,
Substring(DateFrom, CHARINDEX('/', DateFrom) + 1, 4)
* 100
+ Cast(int,
Substring(DateFrom, 1, CHARINDEX('/', DateFrom));
【讨论】:
谢谢你们。我会调查的。我不得不暂时放弃这个项目。我会让你知道我是否可以让它工作。
【讨论】: