Tengo un problema con algunas consultas de SQL Server. Resulta que tengo una tabla con los campos "Attibute_Name" y "Attibute_Value", que pueden ser de cualquier tipo, almacenados en varchar. (Sí ... lo sé)¿La conversión a datetime falla solo en la cláusula WHERE?
Todas las fechas para un atributo en particular parecen almacenarse en el formato "AAAA-MM-DD hh: mm: ss" (no 100% seguro de eso, hay millones de los registros aquí), para que pueda ejecutar este código sin problemas:
select /*...*/ CONVERT(DATETIME, pa.Attribute_Value)
from
ProductAttributes pa
inner join Attributes a on a.Attribute_ID = pa.Attribute_ID
where
a.Attribute_Name = 'SomeDate'
sin embargo, si ejecuto el siguiente código:
select /*...*/ CONVERT(DATETIME, pa.Attribute_Value)
from
ProductAttributes pa
inner join Attributes a on a.Attribute_ID = pa.Attribute_ID
where
a.Attribute_Name = 'SomeDate'
and CONVERT(DATETIME, pa.Attribute_Value) < GETDATE()
voy a tener el siguiente error: error de conversión al convertir fecha y/o hora de la cadena de caracteres.
¿Cómo es que falla en la cláusula where y no en la seleccionada?
Otra pista:
Si en lugar de filtrado por el nombre_atributo utilizo el attribute_id real almacenado en la base de datos (PK) que va a funcionar sin problema.
select /*...*/ CONVERT(DATETIME, pa.Attribute_Value)
from
ProductAttributes pa
inner join Attributes a on a.Attribute_ID = pa.Attribute_ID
where
a.Attribute_ID = 15
and CONVERT(DATETIME, pa.Attribute_Value) < GETDATE()
actualización Gracias a todos por las respuestas. Me resultó difícil elegir una respuesta correcta porque todos señalaron algo útil para comprender el problema. Definitivamente tenía que ver con el orden de ejecución. Resulta que mi primera consulta funcionó correctamente porque la cláusula WHERE se ejecutó primero, luego SELECCIONA. Mi segunda consulta falló debido a la misma razón (ya que los Atributos no se filtraron, la conversión falló al ejecutar la misma cláusula WHERE). Mi tercera consulta funcionó porque la ID formaba parte de un índice (PK), por lo que tuvo prioridad y primero profundizó los resultados en esa condición.
Gracias!
hay otro atributo llamado 'sOmeDaTe' - en caso de que esté utilizando una intercalación insensible? Probablemente está estropeando tus uniones. – YetAnotherUser
Parece que está asumiendo algún tipo de evaluación de cortocircuito u orden garantizada de los predicados en la cláusula 'WHERE'. Esto no está garantizado Cuando ha mezclado tipos de datos en una columna como esa, la única forma segura de manejarlos es con una expresión 'CASE'. –
¿Qué tabla es PHA? Si la PHA es una tabla diferente a la de PA, parecería que los datos de la PHA tienen algunos registros inconvertibles, mientras que los de la AP no lo hacen. – N0Alias