sql >> Database teknologi >  >> RDS >> Sqlserver

Hvorfor ville YEAR mislykkes med en konverteringsfejl fra en dato?

Jeg antager, at RValues er en strengsøjle af en eller anden type, af en eller anden grund. Du bør rette det og gemme datodata ved hjælp af en datodatatype (naturligvis i en separat kolonne end denne blandede sag).

Hvis du ikke kan rette det, så kan du forhindre det, Damien beskrev ovenfor ved:

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

(Hvilket vil gøre "datoen" til NULL hvis SQL Server ikke kan finde ud af at konvertere den til en dato.)

Du kan ikke forhindre dette blot ved at tilføje en WHERE klausul, fordi SQL Server ofte forsøger at forsøge at konvertere i SELECT liste, før du udfører filteret (alt afhænger af planen). Du kan heller ikke fremtvinge rækkefølgen af ​​operationer ved at bruge en underforespørgsel, CTE, joinordrehints osv. Der er et åbent Connect-emne om dette problem - de er "bevidste om det" og "håber at løse det i en fremtidig version ."

Kort for et CASE-udtryk, som tvinger SQL Server til at evaluere ISDATE()-resultatet før forsøg på at konvertere (så længe der ikke er aggregater til stede i nogen af ​​grenene ), kan du:

  • dump de filtrerede resultater i en #temp-tabel, og vælg derefter fra den #temp-tabel, og anvend kun konverteringen derefter.
  • Bare returner strengen, og behandle den som en dato på klienten, og træk YEAR/MONTH osv. dele ud af den der
  • brug bare strengmanipulation til at trække YEAR =LEFT(col,4) osv.
  • brug TRY_CONVERT() siden jeg lige har bemærket, at du er på SQL Server 2012:

    TRY_CONVERT(DATE, RValues) AS FechaFirma
    



  1. Tvetydighed i venstre-sammenføjninger (kun orakel?)

  2. Automatisk stigning på delvis primær nøgle med Entity Framework Core

  3. Fejlfinding af problemer ved arbejde med dato og klokkeslæt i SQL Server

  4. Synkroniser SQL-logins-værktøjet i 2005/2008