我正在使用LINQ-to-SQL,需要按日期字段排序。日期字段存储为文本,并且可以包含任何内容,因为它是用户输入的数据。我需要处理那里存在无效日期的案件 例如,日期“02/23/0000”返回:
将varchar数据类型转换为日期时间数据类型会导致超出范围的值。
我需要避免错误,我不在乎这样的无效日期被排序到哪里。项目的参数意味着我无法修改我的源数据,只能从中读取 这是LINQ语句的示例。
from x in dbo_myTable
orderby Convert.ToDateTime(x.MyDateField)
select x
答案 0 :(得分:1)
你肯定需要在数据库中执行排序吗?在这种情况下,我会强烈考虑提取所有数据,然后在.NET代码中执行一些转换,在那里你可以更好地控制正在发生的事情,然后在.NET代码中对它进行排序。
最终,在这种情况下处理搞砸的数据是棘手的 - 你拥有的控制越多越好。
答案 1 :(得分:0)
首先是第一个; 为什么你不能改变数据库来修复你明显破坏表结构?为什么在进入数据库时无法清理输入?你为什么不验证用户输入?
现在回答;您唯一的选择是尝试解析日期(使用DateTime.TryParse或DateTime.TryParseExact)并设置您选择的默认值,如果它无法解析:
from x in dbo_myTable
orderby TryConvertToDateTime(x.MyDateField)
select x
private DateTime TryConvertToDateTime(string dt)
{
DateTime rtn = DateTime.MinValue; // or whatever you want your default to be
DateTime.TryParse(dt,out rtn);
return rtn;
}
答案 2 :(得分:0)
你可以这样做(基于你的评论,他们都是10个字符)
from x in dbo_myTable
orderby x.MyDateField.Substring(6, 4), x.MyDateField.Substring(0, 2), x.MyDateField.Substring(3, 2)
select x