sql >> Base de Datos >  >> RDS >> Sqlserver

¿Por qué AÑO fallaría con un error de conversión de una Fecha?

Supongo que RValues es una columna de cadena de algún tipo, por alguna razón. Debe corregir eso y almacenar datos de fecha usando un tipo de datos de fecha (obviamente en una columna separada de esta bolsa mixta).

Si no puede arreglar eso, puede evitar lo que Damien describió anteriormente:

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

(Lo que hará que la "fecha" NULL si SQL Server no puede averiguar cómo convertirlo en una fecha).

No puede evitar esto simplemente agregando un WHERE cláusula, porque SQL Server a menudo intentará realizar la conversión en el SELECT lista antes de realizar el filtro (todo depende del plan). Tampoco puede forzar el orden de las operaciones mediante una subconsulta, CTE, sugerencias de orden de unión, etc. Hay un elemento de Connect abierto sobre este problema:están "conscientes" y "esperan abordarlo en una versión futura ."

A falta de una expresión CASE, que obliga a SQL Server a evaluar el resultado ISDATE() antes de intentar convertir (siempre y cuando no haya agregados presentes en ninguna de las ramas ), podrías:

  • descargar los resultados filtrados en una tabla #temp, y luego seleccionar de esa tabla #temp, y solo aplicar la conversión entonces.
  • simplemente devuelva la cadena y trátela como una fecha en el cliente, y extraiga las partes de AÑO/MES, etc.
  • simplemente utilice la manipulación de cadenas para extraer AÑO =IZQUIERDA(col,4) etc.
  • use TRY_CONVERT() ya que acabo de notar que estás en SQL Server 2012:

    TRY_CONVERT(DATE, RValues) AS FechaFirma