Sql server 2008: запрос для поиска сегодняшней даты в перекрывающихся датах

введите описание изображения здесь

У меня есть приведенная выше таблица, в которой мне нужно получить NoteIndx, соответствующий сегодняшней дате. Просто для тестирования, предположим, что сегодня 2013/06/02 (2 июня 2013 г.), и это даст мне две записи с noteindx 93105 и 104044.

Но правильное значение здесь 104044, так как мне нужно выбрать тот, у которого самый короткий период времени STRTDATE и ENDDATE.

Я пытаюсь выполнить различные запросы sql, но пока не получаю правильный результат.

Может ли кто-нибудь помочь мне с наилучшим запросом, чтобы получить вышеуказанные результаты?

Спасибо.


person Anirudh    schedule 16.01.2014    source источник


Ответы (1)


Это то, что вы хотите?

select top 1 n.*
from notes n
where cast('2013-06-02' as date) >= strtdate and
      cast('2013-06-02' as date) < enddate + 1
order by enddate - strtdate;

При этом не используется between, потому что ваши даты хранятся как datetime - это всегда означает возможность того, что они являются частью времени в дате.

Если вам нужна сегодняшняя дата, используйте getdate() вместо cast('2013-06-02' as date).

person Gordon Linoff    schedule 16.01.2014
comment
+1 Хотел добавить, что BETWEEN тоже можно использовать для сравнения дат. - person user2989408; 17.01.2014
comment
@ user2989408. . . Between будет работать для константы даты (при условии, что в датах нет компонента времени). Это не сработает для getdate(), где enddate сегодня. - person Gordon Linoff; 17.01.2014