Я изменяю существующий запрос для клиента и столкнулся с несколько непонятной проблемой.
Наш клиент использует SQL Server 2008 R2, и рассматриваемая база данных предоставляет пользователю возможность указывать настраиваемые поля для одной из своих таблиц, используя структуру EAV. Все значения, хранящиеся в этой структуре, varchar(255), а некоторые поля предназначены для хранения дат. Рассматриваемый запрос модифицируется, чтобы использовать два из этих полей и сравнивать их (одно — начало, другое — конец) с текущей датой, чтобы определить, какая строка является «текущей».
У меня проблема в том, что часть запроса выполняет CONVERT(DateTime, eav.Value), чтобы превратить varchar в DateTime. Сами преобразования прошли успешно, и я могу включить значение как часть предложения SELECT, но часть вопроса дает мне ошибку преобразования:
Conversion failed when converting date and/or time from character string.
Настоящий кикер заключается в следующем: если я определяю базу для этого запроса (получая список сущностей с двумя значениями настраиваемых полей, сведенными в одну строку) как представление, выбираю представление и фильтрую представление с помощью getdate(), то это работает. правильно, но произойдет сбой, если я добавлю соединение со второй таблицей, используя одно из (не датированных) полей из представления. Я понимаю, что это может быть несколько сложно понять, поэтому при желании я могу опубликовать пример запроса, но этот вопрос уже становится немного длинным.
Я попытался воссоздать базовую структуру в другой базе данных и включить образцы данных, но новая база данных ведет себя так, как ожидалось, поэтому я в растерянности.
EDIT Если это полезно, вот утверждение для представления:
create view Festival as
select
e.EntityId as FestivalId,
e.LookupAs as FestivalName,
convert(Date, nvs.Value) as ActivityStart,
convert(Date, nve.Value) as ActivityEnd
from tblEntity e
left join CustomControl ccs on ccs.ShortName = 'Activity Start Date'
left join CustomControl cce on cce.ShortName = 'Activity End Date'
left join tblEntityNameValue nvs on nvs.CustomControlId = ccs.IdCustomControl and nvs.EntityId = e.EntityId
left join tblEntityNameValue nve on nve.CustomControlId = cce.IdCustomControl and nve.EntityId = e.EntityId
where e.EntityType = 'Festival'
Неудачный запрос таков:
select *
from Festival f
join FestivalAttendeeAll fa on fa.FestivalId = f.FestivalId
where getdate() between f.ActivityStart and f.ActivityEnd
Тем не менее, это работает:
select *
from Festival f
where getdate() between f.ActivityStart and f.ActivityEnd
(EntityId/FestivalId столбцы int)