LINQ转换日期,需要处理坏日期

时间:2011-07-29 14:11:59

标签: sql-server linq linq-to-sql date

我正在使用LINQ-to-SQL,需要按日期字段排序。日期字段存储为文本,并且可以包含任何内容,因为它是用户输入的数据。我需要处理那里存在无效日期的案件 例如,日期“02/23/0000”返回:

  

将varchar数据类型转换为日期时间数据类型会导致超出范围的值。

我需要避免错误,我不在乎这样的无效日期被排序到哪里。项目的参数意味着我无法修改我的源数据,只能从中读取 这是LINQ语句的示例。

from x in dbo_myTable
orderby Convert.ToDateTime(x.MyDateField)
select x

3 个答案:

答案 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