sql >> Databasteknik >  >> RDS >> Sqlserver

Varför skulle YEAR misslyckas med ett konverteringsfel från ett datum?

Jag antar att RValues är en strängkolumn av någon typ, av någon anledning. Du bör fixa det och lagra datumdata med en datumdatatyp (uppenbarligen i en separat kolumn än den här blandade väskan).

Om du inte kan fixa det kan du förhindra det som Damien beskrev ovan genom att:

CASE WHEN ISDATE(RValues) = 1 THEN CONVERT(Date, RValues) END AS FechaFirma 

(Vilket gör "datumet" NULL om SQL Server inte kan ta reda på hur man konverterar det till ett datum.)

Du kan inte förhindra detta helt enkelt genom att lägga till en WHERE sats, eftersom SQL Server ofta försöker att försöka konvertera i SELECT lista innan du utför filtret (allt beror på planen). Du kan inte heller tvinga fram operationsordningen genom att använda en underfråga, CTE, anslutningsordertips, etc. Det finns ett öppet Connect-objekt om det här problemet - de är "medvetna om det" och "hoppas kunna lösa det i en framtida version ."

Kort om ett CASE-uttryck, vilket tvingar SQL Server att utvärdera ISDATE()-resultatet innan man försöker konvertera (så länge det inte finns några aggregat i någon av grenarna ), kan du:

  • dumpa de filtrerade resultaten i en #temp-tabell och välj sedan från den #temp-tabellen och använd endast konverteringen då.
  • Skicka bara tillbaka strängen och behandla den som ett datum på klienten, och dra ut delar av ÅR/MÅNAD etc. ur den där
  • använd bara strängmanipulation för att dra YEAR =LEFT(col,4) etc.
  • använd TRY_CONVERT() eftersom jag precis märkte att du är på SQL Server 2012:

    TRY_CONVERT(DATE, RValues) AS FechaFirma
    



  1. Node-mysql infogningsfråga med två värden?

  2. RMySQL, hämtningsfel - RS-DBI-drivrutinsvarning:(fel vid hämtning av rader)

  3. Ordna radval efter flera kolumner

  4. orakel infoga endast tid