SQL Server - complicado?

 
Vista:

complicado?

Publicado por eljhonb (124 intervenciones) el 14/08/2007 19:03:58
tengo la siguiente consulta

select *
From [importacion].dbo.ztrao JOIN TB_PILA_Novedad ON Tra_cedul = Id_empleado
Where (Isnumeric(Id_empleado)=1 and isdate(periodo_pago+'01')=1 and Nov_retiro='x'
and est_transmision = 1 and Estado_registro = 0)
and (isdate(Tra_ferere)=1
AND datediff(month,Tra_ferere,Periodo_pago+'01') = 0)

el problema:
esta consulta me está generando un error en el datediff. el campo Tra_ferere, no todos son de tipo date, hay algunos registros que tienen valor 0, lo cual me genera un error al tratar de convertir el campo a date para hacer el datediff. Esto debería contrarestarse con la condición que dice isdate(Tra_ferere)=1, pero al mirar el plan de ejecución me doy cuenta que primero trata de hacer el datediff y luego el isdate(tra_ferere).
cómo "obligar" el sql para que primero realice el isdate(tra_ferere) y luego sí realice el datediff?

Muchas Gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:complicado?

Publicado por Isaias (3308 intervenciones) el 14/08/2007 22:53:54
¿Y si le indicas que primero te resuelva lo del ISDATE?

select *
From [importacion].dbo.ztrao JOIN TB_PILA_Novedad ON Tra_cedul = Id_empleado
Where ISDATE(Tra_ferere)=1
AND ( Isnumeric(Id_empleado)=1
isdate(periodo_pago+'01')=1 and Nov_retiro='x'
and est_transmision = 1 and Estado_registro = 0)
AND datediff(month,Tra_ferere,Periodo_pago+'01') = 0)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:complicado?

Publicado por eljhonb (124 intervenciones) el 15/08/2007 00:53:25
ya lo he intentado así y me sigue generando el mismo error. está bastante raro ese error, no sé que pueda ser....
si tienes alguna otra sugerencia con gusto la aplicaré
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:complicado?

Publicado por Isaias (3308 intervenciones) el 15/08/2007 01:25:41
¿De que tabla es Tra_ferere?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:complicado?

Publicado por eljhonb (124 intervenciones) el 15/08/2007 05:49:34
de ztrao

reescribo la consulta para que sea mas legible

select *
From [importacion].dbo.ztrao Z JOIN TB_PILA_Novedad N ON Z.Tra_cedul = N.Id_empleado
Where (Isnumeric(N.Id_empleado)=1 and isdate(N.periodo_pago+'01')=1 and Nov_retiro='x'
and N.est_transmision = 1 and N.Estado_registro = 0)
and (isdate(Z.Tra_ferere)=1
AND datediff(month,Z.Tra_ferere, N.Periodo_pago+'01') = 0)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:complicado?

Publicado por Isaias (3308 intervenciones) el 15/08/2007 19:35:23
¿Esto te funciona?

SELECT * FROM [importacion].dbo.ztrao WHERE (isdate(Z.Tra_ferere)=1 AND datediff(month,ztrao.Tra_ferere, N.Periodo_pago+'01') = 0)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:complicado?

Publicado por eljhonb (124 intervenciones) el 15/08/2007 20:53:39
No funciona de esa manera tampoco.. es algo muy extraño..
mirá lo que acabo de descubrir:
la tabla ztrao la importa de otro servidor y la almaceno en una base de datos llamada importacion, que no es la base de datos de mi proyecto.
si importo ztrao y la almaceno en la base de datos del proyecto, la consulta se hace sin ningún problema.
cuál puede ser el problema? los collate de la base de datos y de los campos son iguales. Los campos en cuestión son de tipo varchar(8)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:complicado?

Publicado por Isaias (3308 intervenciones) el 15/08/2007 21:00:37
¿VARCHAR(8)?, Creo que ahi esta el problema amigo, DEBERIAS hacer un CAST para pasarlos a DATETIME, ¿Cierto?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:complicado?

Publicado por eljhonb (124 intervenciones) el 16/08/2007 06:15:21
pues la verdad no creo que ese sea el problema, pues el sqlserver hace internamente la conversión a datetime cuando realiza la función datediff.
sin embargo, he realizado el cast a datetime y tampoco a funcionado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:complicado?

Publicado por Complicado? (2 intervenciones) el 19/09/2007 18:05:09
es correcto.

El problema es que siempre estas evaluando el datediff, para evitarlo seria primero preguntar si es fecha y si es asi evaluarla, sino no.....

cambiar

isdate(Tra_ferere)=1
AND datediff(month,Tra_ferere,Periodo_pago+'01') = 0

por

0 = Case When isdate(Tra_ferere) = 1
Then datediff(month,Tra_ferere,Periodo_pago+'01') Else 1 End
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar