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ć.