我需要按日期排序,但日期作为文本存储在数据库中。我正在使用Linq来执行查询。
设计数据库的方式将列更改为日期列是不可行的,因为该列中有许多不同的数据类型。有一个名为type
的描述符列,因此我将知道特定行的类型。
答案 0 :(得分:2)
您可以将一个计算列添加到表中,当您的鉴别器具有特定值时,这些字符串将转换为日期(此处我刚刚使用'date'
)。
ALTER TABLE Foo
ADD trueDate AS
CASE
WHEN type = 'date' THEN CONVERT(date, 'mixedColumn', 101)
ELSE NULL
END
PERSISTED
如果您有时间信息,date
函数中的datetime
应为CONVERT()
。
此外,101
是指示预期格式MM/dd/yyyy
的样式代码。如果你有不同的东西,请参考:http://msdn.microsoft.com/en-us/library/ms187928.aspx,但请记住,如果你使用低于100的样式,你的表达式将被认为是非确定性的,你不能使你的计算列PERSISTED
,所以转换将在每次查询时动态完成(您不希望如此)。
当行值改变时,计算列将自动更新;否则值将保持可查询状态,就像在任何其他列中一样。无需触发器。
答案 1 :(得分:0)
如果包含日期的所有行都使用相同的日期格式,则可以按字符串值排序。但由于最常见的(即英语)日期格式不是以年份开始,因此可能会出现问题。
选项A。:在内存中排序。
var records = db.YourTable.Where(o=>o.Discriminator =="date").AsEnumerable()
.Select(o=>new {Entity= o, Date=DateTime.Parse(o.YourColumn)})
.OrderBy(o.Date).Select(o=>o.Entity);
如果您有很多行,或者如果必须,至少要有正确的内容来缓存订购的结果,请不要这样做...
选项B:数据库魔术
在数据库中添加一个额外的列,使该日期(可为空),如果鉴别器是日期,则更新该列。您可以在(DML)触发器中或从 C#中更新它...
或者,如果转换很简单,您可以构建一个视图 ...