Nie możesz mieszać typów danych w wyrażeniach CASE (a przynajmniej nie dbając o to, aby niejawnie rzutowały OK)
w przypadku konfrontacji ze stwierdzeniem takim jak następujący SQL Server użyje pierwszeństwa typu danych, aby określić, jaki powinien być ogólny typ danych wyrażenia
SELECT CASE WHEN 1=1 THEN 'not-a-date' ELSE getdate() END
Dla powyższego datetime
ma wyższy priorytet niż char
więc niejawnie rzutuje łańcuch na datę, która się nie powiedzie.
Następujące jednak kończy się sukcesem jako sql_variant
ma wyższy priorytet
SELECT CASE WHEN 1=1 THEN cast('not-a-date' as sql_variant) ELSE getdate() END
Możesz więc w ten sposób zwrócić wiele mieszanych typów danych (nie jestem pewien, jak łatwo jest sql_variant
jest jednak pracować)
Poza tym możesz zwrócić NULL
dla nieprawidłowych dat i godzin zamiast zwracania bezsensownych danych lub rzutowania wszystkiego na ciąg, jeśli musisz go zwrócić.