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

Perché YEAR dovrebbe fallire con un errore di conversione da una data?

Presumo che RValues è una colonna di stringa di qualche tipo, per qualche motivo. Dovresti risolverlo e archiviare i dati della data utilizzando un tipo di dati della data (ovviamente in una colonna separata rispetto a questo miscuglio).

Se non riesci a risolverlo, puoi impedire ciò che Damien ha descritto sopra:

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

(Che renderà la "data" NULL se SQL Server non riesce a capire come convertirlo in una data.)

Non puoi impedirlo semplicemente aggiungendo un WHERE clausola, perché SQL Server tenta spesso di tentare la conversione in SELECT elenco prima di eseguire il filtro (tutto dipende dal piano). Inoltre, non è possibile forzare l'ordine delle operazioni utilizzando una sottoquery, CTE, suggerimenti per l'ordine di unione e così via. C'è un elemento Connect aperto su questo problema:ne sono "consapevoli" e "spero di risolverlo in una versione futura ."

A meno di un'espressione CASE, che obbliga SQL Server a valutare il risultato ISDATE() prima di tentare la conversione (purché non siano presenti aggregati in nessuno dei rami ), potresti:

  • Esegui il dump dei risultati filtrati in una tabella #temp, quindi seleziona da quella tabella #temp e applica solo la conversione.
  • Restituisci semplicemente la stringa e trattala come una data sul client, quindi estrai le parti di ANNO/MESE ecc.
  • usa semplicemente la manipolazione delle stringhe per tirare YEAR =LEFT(col,4) ecc.
  • usa TRY_CONVERT() da quando ho appena notato che sei su SQL Server 2012:

    TRY_CONVERT(DATE, RValues) AS FechaFirma