使用Linq to SQL仅搜索SQL 2008中日期的时间部分

时间:2010-12-28 23:58:56

标签: sql linq-to-sql sql-server-2008 lambda

我希望能够在DateTime字段上搜索日期范围,还能搜索时间范围。例如,“让我在5月份创建所有记录,创建时间为下午1点到3点”。我想要生成的SQL是:

WHERE CreatedOn BETWEEN '05/01/2010' AND '06/01/2010' AND CONVERT(time(4), CreatedOn) BETWEEN '01:00 PM' AND '03:00 PM'

我似乎无法弄明白如何获得一个lambda表达式来帮助我。有人有任何线索吗?我的项目中有System.Linq.Dynamic。类似于将字符串作为OrderBy子句传递的方式,我想我可以对Where方法做同样的操作,如下所示::

results = results.Where("CONVERT(time(4), OccurredOn) BETWEEN '{0}' AND '{1}'", Criteria.OffenseTimeStart, Criteria.OffenseTimeEnd);

但是在System.Linq.Dynamic中引发异常。有人有指点吗?

感谢帮助!这是我的工作代码摘录。我将时间条件属性公开为TimeSpans:

            if (Criteria.OffenseDateStart.HasValue)
                results = results.Where(o => o.OccurredOn >= Criteria.OffenseDateStart);

            if (Criteria.OffenseDateEnd.HasValue)
                results = results.Where(o => o.OccurredOn <= Criteria.OffenseDateEnd);

            if (Criteria.OffenseTimeStart.HasValue)
                results = results.Where(o => o.OccurredOn.TimeOfDay >= Criteria.OffenseTimeStart);

            if (Criteria.OffenseTimeEnd.HasValue)
                results = results.Where(o => o.OccurredOn.TimeOfDay <= Criteria.OffenseTimeEnd);

2 个答案:

答案 0 :(得分:2)

我认为你不能做'Between',但是你可以编写一个linq查询,如:

where (x.CreatedOn.Date >= myDate.Date && x.CreatedOn.Date <= myDate2.Date)
   && (x.CreatedOn.TimeOfDay >= TimeSpan.Parse("13:00") && x.CreatedOn.TimeOfDay <= TimeSpan.Parse("15:00"))

答案 1 :(得分:0)

这样的东西?

results = results.Where(x => x.OccurredOn.Date >= Criteria.OffenseDateStart.Date
         && x.OccurredOn.Date <= Criteria.OffenseDateEnd.Date
         && x.OccurredOn.TimeOfDay >= Criteria.OffenseTimeStart.TimeOfDay
         && x.OccurredOn.TimeOfDay <= Criteria.OffenseTimeEnd.TimeOfDay);

(假设OccurredOnOffenseDateStartOffenseDateEndOffenseTimeStartOffenseTimeEnd都输入DateTime。)