Я изменяю существующий запрос для клиента и столкнулся с несколько сбивающей с толку проблемой.
Наш клиент использует 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 ()
, тогда он работает правильно, но это не удается, если я добавляю соединение ко второй таблице, используя одно из полей (без даты) из представления. Я понимаю, что это может быть довольно сложно выполнить, поэтому при желании я могу опубликовать пример запроса, но этот вопрос уже становится немного длинным.
Я попытался воссоздать базовую структуру в другой базе данных, включая образцы данных, но новая база данных ведет себя так, как ожидалось, поэтому я здесь в растерянности.
РЕДАКТИРОВАТЬ Если это полезно, вот инструкция для представления:
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)