Используйте Linq to SQL для поиска только временных частей даты в SQL 2008 - PullRequest
4 голосов
/ 29 декабря 2010

Я хочу иметь возможность поиска по полю DateTime не только по диапазону дат, но и по диапазону времени.Например, «Получите все записи за май, созданные с 13:00 до 15:00».SQL, который я ищу, генерирует:

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

Я не могу понять, как получить лямбда-выражение, чтобы попасть туда.У кого-нибудь есть подсказка?У меня есть 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 ]

2 голосов
/ 29 декабря 2010

Я не думаю, что вы можете сделать '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"))
0 голосов
/ 29 декабря 2010

Как-то так?

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);

(Предполагая, что OccurredOn, OffenseDateStart, OffenseDateEnd, OffenseTimeStart и OffenseTimeEnd все напечатаны как DateTime.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...