Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-09-2007
Borjaserrano Borjaserrano is offline
Registrado
 
Registrado: Sep 2007
Posts: 8
Poder: 0
Borjaserrano Va por buen camino
Realizar una consulta sobre los registros que devuelve otra consulta

Hola amigos

He heredado una base de datos con un campo Fecha_alta de tipo VARCHAR(100), si!.. increíble!

Lo primero que he hecho ha sido convertir esos campos a Date, usando un CAST. A su vez he tenido que ir concatenando partes de esos campos dado que tenían formato 'dd.mm.aaaa', y tenía que convertir esto a 'dd/mm/aaaa'

La sentencia que he empleado para esto, es la siguiente:

Código SQL [-]
SELECT * FROM MyTable WHERE MyDATE_VARCHAR != 'No Date' AND MyDATE_VARCHAR != ''
and CAST((SUBSTRING ( MyDATE_VARCHAR FROM 7 FOR 4 )||'/'||SUBSTRING ( MyDATE_VARCHAR FROM 4 FOR 2 )||'/'||SUBSTRING ( MyDATE_VARCHAR FROM 1 FOR 2 )) AS DATE) > '01/01/2001'
and CAST((SUBSTRING ( MyDATE_VARCHAR FROM 7 FOR 4 )||'/'||SUBSTRING ( MyDATE_VARCHAR FROM 4 FOR 2 )||'/'||SUBSTRING ( MyDATE_VARCHAR FROM 1 FOR 2 )) AS DATE) > '01/01/2008'


¿Cual es el problema que tengo?

Tal y como podéis ver en la sentencia SQL primero evalúo que el campo no tenga el valor 'Sin Fecha'.. Si!!, este campo no solo puede contener fechas en formato 'dd.mm.aaaa', sino también la cadena, 'Sin fecha' !.

Por culpa de estos registros con el valor 'Sin fecha', la sentencia de antes me da errores al hacer el CAST de una cadena con ese valor (no se puede convertir a DATE).

Por tanto, lo que me gustaría hacer sería una consulta que devolviera todos los registros que no tengan este dichoso valor, y una vez obtenidos, realizar otra consulta distinta sobre ellos haciendo bien el CAST.

¿Alguna idea de cómo hacer esto?

Gracias de antemano.
Responder Con Cita
  #2  
Antiguo 27-09-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: May 2003
Posts: 7.424
Poder: 23
Lepe Va por buen camino
El error no puede ser por el texto 'No Date' ya que en el where estas diciendo que esos registros no los seleccione, más bien puede haber registros con valor nulo (NULL) para el campo varchar, que obviamente, es distinto de la cadena vacía.

Yo lo haría de este modo:

crearía un nuevo campo en la tabla de tipo date. Valor por defecto NULL
ahora intento el copiado asi (Fecha es el nuevo campo de tipo Date):
Código SQL [-]
update mytable set Fecha = CAST((SUBSTRING ( MyDATE_VARCHAR FROM 7 FOR 4 )
||'/'||SUBSTRING ( MyDATE_VARCHAR FROM 4 FOR 2 )
||'/'||SUBSTRING ( MyDATE_VARCHAR FROM 1 FOR 2 )) AS DATE)

WHERE

MyDATE_VARCHAR <> 'No Date' 
AND MyDATE_VARCHAR <> ''
AND MyDATE_VARCHAR IS NOT NULL

Ahora los que tienen fecha, ya tienen su valor asignado.
Los que tienen 'No Date' o eran nulos o era un texto vacío, ya tienen un NULL, PERO es muy posible que haya registros con otros valores distintos, y sería bueno comprobarlo con:
Código SQL [-]
select fecha, fecha_VARCHAR
from mytable
where 
   fecha is null
AND MyDATE_VARCHAR <> 'No Date' 
AND MyDATE_VARCHAR <> ''
AND MyDATE_VARCHAR IS NOT NULL
Si esta consulta devuelve algún registro, tendrás que asignar el campo Fecha al valor que creas conveniente.


La verdad, no sé por qué usas el operador "!=" yo siempre he usado "<>" en Firebird.

Edito: hay una pequeña incongruencia en lo expuesto: Dices que quieres el formato dd/mm/aaaa, sin embargo, el SQL pone el formato aaaa/mm/dd. Yo no sé el formato que espera Firebird para una fecha, ya que siempre he usado la biblioteca rfunc que trae una UDF encodeDate.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 27-09-2007 a las 11:15:49.
Responder Con Cita
  #3  
Antiguo 27-09-2007
Borjaserrano Borjaserrano is offline
Registrado
 
Registrado: Sep 2007
Posts: 8
Poder: 0
Borjaserrano Va por buen camino
Gracias por tu atención, Lepe

Realmente el error me viene por el casteo de un registro 'Sin emitir', dado que me devuelve un error "Overflow occurred during data type Conversion error from string "itir/ e/Si" (en realidad la cadena del registro es 'Sin emitir', no 'No date')

El tema del formato lo hice finalmente así, porque era como lo requería la base de datos.

Lo único que necesitaría sería hacer una primera consulta sin los registros 'Sin emitir', y después hacer una consulta sobre esos resultados.

He probado el crear una vista, y luego hacer una consulta sobre esa vista, pero me sigue dando el mismo error. Me imagino que esto será porque la vista llama a la table en cuestión y aplica todas las condiciones.
Responder Con Cita
  #4  
Antiguo 27-09-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: May 2003
Posts: 7.424
Poder: 23
Lepe Va por buen camino
Si en el where estamos diciendo "WHERE MyDATE_VARCHAR <> 'Sin emitir' " todos esos registros no los procesa el update que puse, por tanto, ese error no debe producirse. Prueba mi sql en un TIbquery y usa "ibquery1.ExecSql" en lugar de "ibquery1.Open".

En la condición WHERE no puedes poner ese cast, porque entonces SI procesa los registros 'Sin emitir', y obviamente da el error.

En las consultas, el Sistema Gestor, primero evalúa la condición where, para saber los registros que debe seleccionar, posteriormente, los selecciona y ejecuta la parte Select / Update / Insert etc. Como ves en mi parte where no se hace ningún moldeo de tipos.

Edito: No necesitas 2 consultas, en una sola (la que puse anteriormente) lo hace todo. Pruébala


Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 27-09-2007
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: Jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 16
Caro Va por buen camino
Hola, porque en vez de guardar como cadena 'Sin emitir', simplemente lo guardas como null, porque cuando es null si funciona, al final igual significara para ti que los registros que tengan ese campo como nulo son los 'sin admitir', dos detallitos que he visto en el formato de la fecha lo estas concatenando 'aaa/mm/dd' cuando deberia ser 'mm/dd/aaaa' y en tu comparación ambos estan con > (mayor), supongo que se te ha ido.

Código SQL [-]
SELECT * FROM MyTable WHERE MyDATE_VARCHAR IS NOT NULL
AND (CAST((SUBSTRING ( MyDATE_VARCHAR FROM 4 FOR 2 )||'/'||SUBSTRING ( MyDATE_VARCHAR FROM 1 FOR 2 )||'/'||SUBSTRING ( MyDATE_VARCHAR FROM 7 FOR 4 )) AS DATE) > '01/01/2005'
AND CAST((SUBSTRING ( MyDATE_VARCHAR FROM 4 FOR 2 )||'/'||SUBSTRING ( MyDATE_VARCHAR FROM 1 FOR 2 )||'/'||SUBSTRING ( MyDATE_VARCHAR FROM 7 FOR 4 )) AS DATE) < '01/01/2008')


Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.

Última edición por Caro fecha: 27-09-2007 a las 15:55:14.
Responder Con Cita
  #6  
Antiguo 27-09-2007
Borjaserrano Borjaserrano is offline
Registrado
 
Registrado: Sep 2007
Posts: 8
Poder: 0
Borjaserrano Va por buen camino
Hm.. y qué os parecería el hacer una consulta anidada?:

Código SQL [-]
SELECT * FROM 
(SELECT * FROM MyTable WHERE MyDate_Varchar <> 'No Date' AND MyDate_Varchar <> '' AND MyDate_Varchar IS NOT NULL)
WHERE CAST((SUBSTRING ( MyDATE_VARCHAR FROM 4 FOR 2 )||'/'||SUBSTRING ( MyDATE_VARCHAR FROM 1 FOR 2 )||'/'||SUBSTRING ( MyDATE_VARCHAR FROM 7 FOR 4 )) AS DATE) < '01/01/2008')

Esta consulta hace perfectamente lo que estaba buscando... pero solamente en el ordenador de uno de mis compis de trabajo!!!!. En el resto de ordenadores no funciona, ni tampoco en el servidor!. Estoy mirando la razón por la que pueda suceder esto. Tenemos todos el Firebird 1.5 instalado. El ordenador en el cual esta consulta funciona tiene un par de dll's de Firebird 2.0 instaladas en la GAC. No obstante he desinstalado el 1.5 y he instalado el 2.0 y me sigue sin funcionar este tipo de sentencias.

Tenéis una idea del porque de esto?. Tal vez hay algún paquete que se pueda instalar, que añada la posibilidad de usar estas consultas a Firebird?
Responder Con Cita
  #7  
Antiguo 27-09-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: May 2003
Posts: 7.424
Poder: 23
Lepe Va por buen camino
Cita:
Empezado por Lepe Ver Mensaje
En la condición WHERE no puedes poner ese cast, porque entonces SI procesa los registros 'Sin emitir', y obviamente da el error.
No comment

O no quiere leerme, o me tiene ignorado.... no sé.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #8  
Antiguo 27-09-2007
[egostar] egostar is offline
Registrado
 
Registrado: Feb 2006
Posts: 6.421
Poder: 19
egostar Va por buen camino
Cita:
Empezado por Lepe Ver Mensaje
No comment

O no quiere leerme, o me tiene ignorado.... no sé.
Vamo amigo Lepe, no te sientas mal, no te ignoran, simplemente que ya se aferraron a una solución, verás que ahora si reaccionan

Yo mejor me callo la boca, no puedo dar una solucion

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #9  
Antiguo 28-09-2007
Borjaserrano Borjaserrano is offline
Registrado
 
Registrado: Sep 2007
Posts: 8
Poder: 0
Borjaserrano Va por buen camino
No amigo Lepe, no te ignoro, solo que la consulta a la que te refieres conlleva añadir una columna a la tabla, y no puedo hacer dicha operación. Tenemos aproximadamente 500 bases de datos a las que habría que añadirles esa columna, y eso sería demasiado arriesgado.

Has probado la consulta que puse antes?. No entiendo como puede funcionar para un servidor de firebird, y para otro no..
Responder Con Cita
  #10  
Antiguo 28-09-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: May 2003
Posts: 7.424
Poder: 23
Lepe Va por buen camino
ahh bueno, si es eso pues se dice y listo, no pasa nada .

En Firebird 1.5, cuando he puesto una fecha como string he tenido que hacerlo en formato mm/dd/aaaa, no sé si haciendo el cast de esa forma te lo acepte.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #11  
Antiguo 28-09-2007
Borjaserrano Borjaserrano is offline
Registrado
 
Registrado: Sep 2007
Posts: 8
Poder: 0
Borjaserrano Va por buen camino
No me refería al tema del casteo, sino a hacer una consulta anidada simple, como por ejemplo

Código:
SELECT * FROM (SELECT * FROM TABLA WHERE Condicion <> 'VAL 1') WHERE Condicion = 'valor'
Esto haría perfectamente la función, dado que ejecutaría una consulta sobre otra consulta previamente hecha, pero no sé por que narices no me tira.. cuando en el pc que está a mi lado va sin problemas!!
Responder Con Cita
  #12  
Antiguo 28-09-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: May 2003
Posts: 7.424
Poder: 23
Lepe Va por buen camino
Prueba así:
Código SQL [-]
SELECT (SELECT fecha FROM TABLA WHERE Condicion <> 'VAL 1') as fecha
from tabla
WHERE Condicion = 'valor'

Creo que debes especificar los campos, el comodin * no lo puedes usar.

En FB 1.5 no me permite un SubSelect en la parte FROM de la consulta principal, pero en la parte SELECT si.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #13  
Antiguo 01-10-2007
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: Nov 2003
Posts: 927
Poder: 15
rastafarey Va por buen camino
Resp

Prueba con La sentencia case.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Consulta con TIMESTAMP no devuelve nada subzero Firebird e Interbase 10 12-09-2007 04:51:06
Consulta dentro de otra consulta judit25 Conexión con bases de datos 1 25-06-2007 15:52:15
Saber si una consulta no devuelve datos rafita SQL 4 18-09-2006 10:00:26
Limitar los registros que devuelve una consulta roman Conexión con bases de datos 1 03-09-2004 09:08:45
Realizar una consulta a otra máquina lore Conexión con bases de datos 2 02-10-2003 16:29:23


La franja horaria es GMT +2. Ahora son las 02:19:29.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi