Вот запрос без CONVERT или CASE:
SELECT *
FROM HastaKurumlari
WHERE '21-05-2009' between startDate and IsNull(endDate,getdate())
Чтобы убедиться, что Sql Server не оценивает getdate () для каждой строки, вы можете кэшировать его, хотя я вполне уверен, что Sql Server по умолчанию достаточно умен:
declare @now datetime
set @now = getdate()
SELECT *
FROM HastaKurumlari
WHERE '21-05-2009' between startDate and IsNull(endDate,@now)
Размещение плана запроса может помочь объяснить, почему запрос выполняется медленно:
SET SHOWPLAN_TEXT ON
go
SELECT *
FROM HastaKurumlari
WHERE CONVERT(SMALLDATETIME,'21-05-2009',103)
BETWEEN startDate
AND (CASE WHEN endDate IS NULL THEN GETDATE() ELSE endDate END)