Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dlaczego YEAR miałby się nie powieść z błędem konwersji z daty?

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
    



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. jak sprawdzić, czy zapytanie korzysta z indeksu

  2. Jak zwiększyć licznik w wyborze?

  3. Nieprawidłowy numer parametru, stan SQL S1093 php odbc mssql

  4. Wybór danych z dwóch różnych serwerów w SQL Server

  5. Jak dołączyć wiele do wielu i zachować tę samą łączną kwotę