Преобразование SQL DateTime не выполняется, когда преобразование не должно происходить

Я изменяю существующий запрос для клиента и столкнулся с несколько сбивающей с толку проблемой.

Наш клиент использует 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)

5
задан Adam Robinson 11 August 2011 в 16:25
поделиться