Найти записи в промежутке между датами - PullRequest
1 голос
/ 11 июня 2010

Пожалуйста, смотрите прикрепленное изображение

альтернативный текст http://img248.imageshack.us/img248/7743/datefrom.png

У меня есть таблица с FromDate и ToDate.FromDate - начало некоторого события, а ToDate - конец этого события.Мне нужно найти запись, если критерии поиска находятся в диапазоне дат.

например,

Если запись имеет FromDate 2010/15/5 и ToDate 2010/15/25 и мои критерииFromDate 2010/5/18, а ToDate - 2010/5/21, тогда эта запись должна быть в результатах поиска, поскольку она находится в диапазоне от 15 до 25.

Ниже приводится мой поисковый запрос (часть)

SELECT   m.EventId
FROM     MajorEvents 

WHERE   (   (m.LocationID = @locationID OR @locationID IS NULL) OR M.LocationID IS NULL)
AND      (
            CONVERT(VARCHAR(10),M.EventDateFrom,23) BETWEEN  CONVERT(VARCHAR(10),@DateTimeFrom,23) AND CONVERT(VARCHAR(10),@DateTimeTo,23) 
            OR
            CONVERT(VARCHAR(10),M.EventDateTo,23) BETWEEN CONVERT(VARCHAR(10),@DateTimeFrom,23) AND CONVERT(VARCHAR(10),@DateTimeTo,23)
        )

Если критерий поиска равен FromDate или ToDate, то результаты в порядке, например, если критерий поиска равен DateFrom = 2010/5/15 AND DateTo = 2010/5/18, то эта запись будет возвращаться, поскольку Date From точночто такое DateFrom в дБ.

ИЛИ

Если критерием поиска является DateFrom = 2010/5/22 AND DateTo = 2010/5/25, то эта запись вернется, поскольку Date To - это именно то, чтоDateTo in db

Но если что-то между этим диапазоном не работает

Спасибо за помощь.

Редактировать:

Я не могу использовать <= или>, потому что это принесет все другие записи, которые меньше и грбольше, чем даты критериев поиска.

Я просто хочу получить те записи, которые находятся в эти даты Например, FromDate = 2010/5/15 и DateTo = 2010/5/25 Это диапазон дат, но событие относится ко всем датамМежду тем, одно из решений заключается в том, что я храню все даты с 2010/5/15 по 2010/5/25 в отдельной таблице, но если я могу сделать это с помощью запроса?

Вы также можете сказать мне, что это не таквозможно.

Ответы [ 3 ]

2 голосов
/ 11 июня 2010

Что по этому поводу:

SELECT   m.EventId
FROM     MajorEvents AS m
WHERE   (   
                ((m.LocationID = @locationID) OR (@locationID IS NULL))
            OR  (m.LocationID IS NULL)
        )
    AND (
                (DATEADD(DAY, DATEDIFF(DAY, 0, m.EventDateFrom), 0) <= DATEADD(DAY, DATEDIFF(DAY, 0, m.@DateTimeTo), 0))
            AND (DATEADD(DAY, DATEDIFF(DAY, 0, m.EventDateTo), 0) >= DATEADD(DAY, DATEDIFF(DAY, 0, m.@DateTimeFrom), 0))
        )
1 голос
/ 11 июня 2010

Почему вы не используете формат ISO при преобразовании в строки, сказав, что ваш запрос будет работать очень плохо, потому что он не SARGable, пожалуйста, прочтите Как работает между датами в SQL Server? это покажет вам, что вы должны использовать где EventDate> = ... AND EventDate <.... </p>

0 голосов
/ 11 июня 2010

Ко второму сообщению NTSystemAnalyst попробуйте этот параметр:

ВЫБЕРИТЕ m.EventId ИЗ MajorEvents AS m ГДЕ (
((m.LocationID = @locationID) ИЛИ (@locationID IS NULL)) ИЛИ (m.LocationID НЕДЕЙСТВИТЕЛЕН))

И (m.EventDateFrom DATEADD (dd, -1,CONVERT (varchar (10), @DateTimeFrom, 23)))

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