Modyfikuję istniejące zapytanie dla klienta i napotkałem na nieco kłopotliwy problem.SQL Konwersja daty i godziny nie działa, gdy nie ma miejsca konwersja
Nasz klient korzysta z SQL Server 2008 R2, a baza danych, o której mowa, umożliwia użytkownikowi określenie pól niestandardowych dla jednej ze swoich tabel, korzystając ze struktury EAV. Wszystkie wartości przechowywane w tej strukturze to varchar(255)
, a kilka pól jest przeznaczonych do przechowywania dat. Zapytanie, o którym mowa, jest modyfikowane w celu użycia dwóch z tych pól i porównania ich (jeden jest początkiem, drugi jest końcem) z bieżącą datą w celu ustalenia, który wiersz jest "aktualny".
Problem mam jest to, że część zapytania robi CONVERT(DateTime, eav.Value)
aby włączyć varchar
w DateTime
. Same konwersje wszystko succedd i mogę to wartość jako część klauzuli SELECT
, ale część pytania daje mi błąd konwersji:
Conversion failed when converting date and/or time from character string.
Prawdziwy kicker jest taka: jeśli zdefiniować podstawę do tego zapytanie (uzyskanie listy jednostek z dwiema niestandardowymi wartościami pól spłaszczonymi w jednym wierszu) jako widoku i wybierz z widoku i filtruj widok przez getdate()
, to działa poprawnie, ale nie powiedzie się, jeśli dodaję sprzężenie do sekundy tabeli przy użyciu jednego z pól (nieaktualnych) z widoku. Zdaję sobie sprawę, że może to być nieco trudne do naśladowania, więc mogę wysłać przykładową kwerendę w razie potrzeby, ale to pytanie już trwa trochę długo.
Próbowałem odtworzyć podstawową strukturę w innej bazie danych, w tym przykładowe dane, ale nowa baza danych zachowuje się zgodnie z oczekiwaniami, więc jestem tu zagubiony.
EDIT W przypadku, jest to przydatne, oto zestawienie dla widoku:
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'
niewydolnego zapytania to:
select *
from Festival f
join FestivalAttendeeAll fa on fa.FestivalId = f.FestivalId
where getdate() between f.ActivityStart and f.ActivityEnd
Jednak to działa:
select *
from Festival f
where getdate() between f.ActivityStart and f.ActivityEnd
(EntityId
/FestivalId
ar e int columns)
prawdopodobnie ze względu na ustawienia narodowe i daty sformatowane w USA i poza USA ... Sprawdź ustawienia regionalne ... Czy możesz podać przykładowe dane pokazujące zachowanie? –
Może zacznij od pierwszego zapytania, które się nie powiedzie i opublikuj. – Paparazzi
@Mitch: To byłaby moja pierwsza myśl, gdybym też odpowiadała, ale są to wszystkie daty z USA, sformatowane w formacie "1 stycznia 2011 r. 12:00" lub "01.01.2011 00:00 ". Mylącą częścią jest to, że błąd zdaje się być związany z czymś, co (według mojej logiki, która oczywiście może być błędna) nie powinno mieć żadnego wpływu na to, czy konwersja ma miejsce. Założę się, że gdyby dane były rzeczywiście złe, wybranie z samego widoku wygenerowałoby błąd, którego nie robi. –