sql >> Databáze >  >> RDS >> Sqlserver

Proč by YEAR selhal s chybou převodu z Date?

Předpokládám, že RValues je z nějakého důvodu řetězcový sloupec nějakého typu. Měli byste to opravit a ukládat data data pomocí datového typu data (samozřejmě v samostatném sloupci, než je tato směs).

Pokud to nemůžete opravit, můžete zabránit tomu, co Damien popsal výše:

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

(Čímž bude „datum“ NULL pokud SQL Server nemůže přijít na to, jak jej převést na datum.)

Tomu nezabráníte jednoduše přidáním WHERE klauzule, protože SQL Server se často pokusí o převod v SELECT seznam před provedením filtru (vše závisí na plánu). Pořadí operací také nemůžete vynutit pomocí poddotazu, CTE, nápověd k objednávce spojení atd. O tomto problému existuje otevřená položka Connect – „uvědomují si to“ a „doufají, že se jím budou zabývat v budoucí verzi ."

Krátký výraz CASE, který nutí SQL Server vyhodnotit výsledek ISDATE() před pokusem o převod (pokud v žádné z větví nejsou přítomny žádné agregáty ), můžete:

  • uložte filtrované výsledky do #temp tabulky a následně vyberte z této #temp tabulky a teprve poté použijte převod.
  • prostě vraťte řetězec a zacházejte s ním jako s datem na klientovi a vytáhněte z něj části ROK/MĚSÍC atd.
  • prostě pomocí manipulace s řetězcem vytáhněte YEAR =LEFT(sloupec,4) atd.
  • použijte TRY_CONVERT() protože jsem si právě všiml, že používáte SQL Server 2012:

    TRY_CONVERT(DATE, RValues) AS FechaFirma
    



  1. SELECT pole MySQL, které obsahuje podřetězec

  2. MySQL:Vyberte všechna data v rozsahu, i když nejsou k dispozici žádné záznamy

  3. Odstranění trasovacích souborů pomocí ADRCI

  4. PostgreSQL/výkon jeden obecný kurzor nebo vytvořit pro každý dotaz