过滤数据,日期存储为字符串而不是DateTime

时间:2018-03-14 08:50:47

标签: c# asp.net linq

我有一个输入开始日期和结束日期的两个字段,所以我想根据输入的日期过滤数据并仅显示那些日期范围内的数据,我的数据库中日期字段存储为字符串而不是DateTime所以iam努力在Linq中编写查询来过滤数据。到目前为止,我搜索我检查这两个字段是否为空,然后我正在努力查询

 if (search.StartDate == null && search.EndDate == null)
            if (search.StartDate!= null && search.EndDate != null)
            {
                    var startDate = search.StartDate;
                    var endDate = search.EndDate;

                    query = query.Where(d => (d.Date) >= startDate.Date && (d.Date) <= endDate.Date).AsQuerybable();
            }

1 个答案:

答案 0 :(得分:1)

由于您的日期存储在MM.DD.YYYY中,因此在编写这些查询时会出现问题,如字符串比较:

12.03.1964 > 04.06.2017

因此,理想情况下,您需要将整个数据库中的日期格式更改为日期,或至少更改为YYYY-MM-DD格式,以便在服务器端应用有意义的范围。

第二个最佳解决方案是在数据库中创建一个视图或存储过程,以便从表中返回应用日期范围的记录,以便可以在服务器端应用该范围。

不需要更改数据库的解决方案只能应用日期范围客户端,并涉及以正确的顺序将字符串的各个部分组合在一起:

query = query.Where(d => 
    DateInRangeFormat(d.Date) >= DateInRangeFormat(startDate.Date)
    && DateInRangeFormat(d.Date) <= DateInRangeFormat(endDate.Date))
    .AsQuerybable();

// accepts date in MM.DD.YYYY format and returns YYYYMMDD
public static string DateInRangeFormat(string date)
{
    return date.SubString(6) + date.SubString(0, 2) + date.SubString(3, 2);
}