我有一个datagrid,其中包含从数据库中重新获取的数据,datagrid以与数据库相同的格式显示数据。
其中一列是DateFrom,这是我想要排序的列。因此,作为Varchar存储在数据库中的日期形式按字母顺序排序,例如2 / 2004,2 / 2008,4 / 2003。我想将DatFrom转换为typ DateTime,并在数据网格中显示之前以数字方式对值进行排序。
有什么办法吗?
由于
AEIN
答案 0 :(得分:1)
我创建了一个小的演示表(测试)。插入一些测试日期并执行选择查询:
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)
答案 1 :(得分:0)
可能会将列包装起来以实现IComparable接口,以便您可以提供自定义排序here is an example。
答案 2 :(得分:0)
我想我明白你在这里问的是什么。如果我离开基地,请告诉我。我认为最简单的解决方法是在select语句中从数据库中获取数据,但它可能不一定是最佳方法。以下是我的想法:
由于“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
我知道这不是最优雅的方法,但只要您的日期格式一致,它就应该有效。祝你好运!
答案 3 :(得分:0)
我不确定我是否理解你的问题。然而,如何在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));
答案 4 :(得分:0)
谢谢你们。我会调查一下。我不得不放弃这个项目一段时间。如果我能让它工作,我会告诉你的。