Zakładam, że RValues
jest z jakiegoś powodu kolumną typu string. Powinieneś to naprawić i przechowywać dane daty przy użyciu typu danych daty (oczywiście w oddzielnej kolumnie niż ta mieszana torba).
Jeśli nie możesz tego naprawić, możesz zapobiec temu, co Damien opisał powyżej:
CASE WHEN ISDATE(RValues) = 1 THEN CONVERT(Date, RValues) END AS FechaFirma
(Co spowoduje, że „data” NULL
jeśli SQL Server nie może dowiedzieć się, jak przekonwertować go na datę.)
Nie możesz temu zapobiec, po prostu dodając WHERE
klauzula, ponieważ SQL Server często próbuje dokonać konwersji w SELECT
lista przed wykonaniem filtru (wszystko zależy od planu). Nie można również wymusić kolejności operacji za pomocą podzapytania, CTE, wskazówek dotyczących kolejności łączenia itp. Istnieje otwarty element Connect dotyczący tego problemu — są oni „świadomi tego” i „mają nadzieję rozwiązać go w przyszłej wersji
”.
Krótkie wyrażenie CASE, które zmusza SQL Server do oceny wyniku ISDATE() przed próbą konwersji (o ile nie ma agregatów w żadnej z gałęzi ), możesz:
- Zrzuć przefiltrowane wyniki do tabeli #temp, a następnie wybierz z tej tabeli #temp i dopiero wtedy zastosuj konwersję.
- po prostu zwróć ciąg i potraktuj go jako datę w kliencie i wyciągnij z niego części ROK/MIESIĄC itp.
- wystarczy użyć manipulacji ciągami, aby wyciągnąć ROK =LEWO(kolumna,4) itd.
-
użyj
TRY_CONVERT()
odkąd właśnie zauważyłem, że korzystasz z SQL Server 2012:TRY_CONVERT(DATE, RValues) AS FechaFirma