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 Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-03-2013
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 22
apicito Va por buen camino
Ayuda con SQL de manejo de fechas

Tengo una consulta del tipo:
Código Delphi [-]
    SQL.Clear;
    SQL.Add('select * from FRAS');
    SQL.Add('where ');
    SQL.Add('   cast(FRAS_CONF1_DATA as date) > '+#39+FormatDateTime('mm/dd/yyyy',now()-30)+#39);
    SQL.Add('or cast(FRAS_CONF2_DATA as date) > '+#39+FormatDateTime('mm/dd/yyyy',now()-30)+#39);
    SQL.Add('or cast(FRAS_CONF3_DATA as date) > '+#39+FormatDateTime('mm/dd/yyyy',now()-30)+#39);
    SQL.Add('order by FRAS_CONF1_DATA, FRAS_CONF2_DATA, FRAS_CONF3_DATA');
donde FRAS_CONF1_DATA,FRAS_CONF2_DATA,FRAS_CONF3_DATA son timestamp.
Lo que necesito es ordenar la consulta por estos 3 campos pero teniendo en cuenta que dependiendo del registro cualquiera de ellos puede ser el más antiguo.
Alguien puede echarme una mano con esto?.
Gracias de antemano.
Un saludo.
Responder Con Cita
  #2  
Antiguo 20-03-2013
Avatar de ozsWizzard
ozsWizzard ozsWizzard is offline
Miembro
 
Registrado: may 2004
Ubicación: Murcia
Posts: 190
Poder: 21
ozsWizzard Va por buen camino
No entiendo que quieres hacer.

¿Según el registro ordenar por un campo distinto o qué?
__________________
La Madurez se llama...
~~~Gaia~~~
Responder Con Cita
  #3  
Antiguo 20-03-2013
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 22
apicito Va por buen camino
Haber si soy capaz de explicarlo bien...
Estos tres campos de fecha guardan el momento en que una factura fue conformada (dada como conforme) o no. Cada factura puede asignarse hasta un máximo de tres personas para que den la conformidad en cascada, es decir, si se asigna a dos personas la primera (FRAS_CONF1_DATA) no puede conformar hasta que está conformada por la segunda (FRAS_CONF2_DATA).
Lo que necesito es recuperar las conformaciones producidas en los últimos 30 días, que es lo que hace el sql que puse en el anterior post, y después ordenar el resultado para que las que tuvieron un evento más reciente aparezcan arriba.
Espero que ahora está más claro.
Un saludo.
Responder Con Cita
  #4  
Antiguo 20-03-2013
Avatar de ozsWizzard
ozsWizzard ozsWizzard is offline
Miembro
 
Registrado: may 2004
Ubicación: Murcia
Posts: 190
Poder: 21
ozsWizzard Va por buen camino
Sigo sin entenderte del todo, no sé si me he aclarado o me he confundido más.

Suponiendo que sea lo que yo he entendido. Tienes tres campo "fecha" y te interesa ordenar por la fecha (cualquiera de las tres) más baja

Código Delphi [-]
      q.SQL.Add('SELECT [campos], FECHA');
      q.SQL.Add('FROM (');
      q.SQL.Add('   SELECT [campos], FRAS_CONF1_DATA AS FECHA');
      q.SQL.Add('   FROM FRAS');
      q.SQL.Add('   WHERE FRAS_CONF1_DATA < FRAS_CONF2_DATA');
      q.SQL.Add('     AND FRAS_CONF1_DATA < FRAS_CONF3_DATA');
      q.SQL.Add('   UNION');
      q.SQL.Add('   SELECT [campos], FRAS_CONF2_DATA as fecha');
      q.SQL.Add('   FROM FRAS');
      q.SQL.Add('   WHERE FRAS_CONF2_DATA < FRAS_CONF1_DATA');
      q.SQL.Add('     AND FRAS_CONF2_DATA < FRAS_CONF3_DATA');
      q.SQL.Add('   UNION');
      q.SQL.Add('   SELECT [campos], FRAS_CONF3_DATA as fecha');
      q.SQL.Add('   FROM FRAS');
      q.SQL.Add('   WHERE FRAS_CONF3_DATA < FRAS_CONF1_DATA');
      q.SQL.Add('     AND FRAS_CONF3_DATA < FRAS_CONF3_DATA');
      q.SQL.Add('   UNION');
      q.SQL.Add('   SELECT [campos], FRAS_CONF1_DATA as fecha');
      q.SQL.Add('   FROM FRAS');
      q.SQL.Add('   WHERE FRAS_CONF1_DATA = FRAS_CONF2_DATA');
      q.SQL.Add('     AND FRAS_CONF1_DATA < FRAS_CONF3_DATA');
      q.SQL.Add('   UNION');
      q.SQL.Add('   SELECT [campos], FRAS_CONF1_DATA as fecha');
      q.SQL.Add('   FROM FRAS');
      q.SQL.Add('   WHERE FRAS_CONF1_DATA = FRAS_CONF3_DATA');
      q.SQL.Add('     AND FRAS_CONF1_DATA < FRAS_CONF2_DATA');
      q.SQL.Add('   UNION');
      q.SQL.Add('   SELECT [campos], FRAS_CONF2_DATA as fecha');
      q.SQL.Add('   FROM FRAS');
      q.SQL.Add('   WHERE FRAS_CONF2_DATA = FRAS_CONF3_DATA');
      q.SQL.Add('     AND FRAS_CONF2_DATA < FRAS_CONF1_DATA');
      q.SQL.Add(')');
      q.SQL.Add('CAST(FECHA AS DATE) > ' +#39 + FormatDateTime('mm/dd/yyyy',now()-30)+#39);
      q.SQL.Add('ORDER BY FECHA');
      //[campo] = Lista de campos
__________________
La Madurez se llama...
~~~Gaia~~~
Responder Con Cita
  #5  
Antiguo 20-03-2013
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
No se si te he entendido bien....

¿Quieres ordenar la consulta de forma que te ordene los registros, pero no por un campo, sino por el valor más antiguo (o nuevo) que exista en cualquiera de esos tres?
¿Es decir que el valor de ordenación sea el más antiguo/nuevo de los tres campos?

Si es así, yo crearía un campo FECHA_CONF_CAL (que se calcule y mantenga por trigger) que almacene y que mantenga el más antiguo o más nuevo de los tres.
Después sólo debes usar ese campo para las ordenaciones.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 20-03-2013
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 22
apicito Va por buen camino
Cita:
Empezado por Neftali Ver Mensaje
Si es así, yo crearía un campo FECHA_CONF_CAL (que se calcule y mantenga por trigger) que almacene y que mantenga el más antiguo o más nuevo de los tres.
Gracias por la respuesta.
Ya había pensado en esto pero pretendía hacerlo sin modificar la base de datos por lo que implicaría a efectos de actualización de todos mis clientes.
Estoy probando la solución de ozsWizzard. Ya no me da errores, pero tampoco me devuelve ningún registro. En algún sitio me estoy equivocando. Ya os diré.
Otra solución en la que habia pensado era en la de utilizar algo como un campo calculado en el que almacenar el valor más reciente de los tres. Pero no sabría como hacerlo.
Sigo con la solución de ozsWizzard.
Por cierto, si, has entendido perfectamente mi problema.Saludos.
Responder Con Cita
  #7  
Antiguo 20-03-2013
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
¿Qué problema hay en cambiar la Base de Datos si es necesario?
En general los UNION son todo lo contrario a "eficientes" y me parece una solución no-directa para un problema bastante sencillo.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 20-03-2013
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 22
apicito Va por buen camino
El problema es la intendencia que me requiere este tipo de cambios...
Responder Con Cita
  #9  
Antiguo 20-03-2013
Avatar de ozsWizzard
ozsWizzard ozsWizzard is offline
Miembro
 
Registrado: may 2004
Ubicación: Murcia
Posts: 190
Poder: 21
ozsWizzard Va por buen camino
Por partes

Seguramente no te salgan datos por culpa de que no me he molestado en tener en consideración las fechas nulas. Tendrías que ajustar los "where"s individuales para que las fechas nulas las tome como "fechas 0".

Neftalí tiene razón, y dado que tendrás que distribuir un ejecutable, siempre puedes crear el campo, si no existe, al iniciar el programa. (Y rellenarlo, para ello seguro que sirve la select que he puesto yo, sin el where final y teniendo en cuenta la posibilidad de los nulos, de esta forma la select solamente la usas una vez, para cargar los datos en el campo [que otra forma sí que no sé])


Edito y añado:
Yo tengo esto mismo en un programa, justo después de establecer la conexión (lo que tengo justo después es la llamada al procedimiento, lógicamente)
Código Delphi [-]
//NO es igual que lo que tengo pero el efecto es el mismo
procedure TDataModule1.AñadirCampoX;
var
   q: TSqlQuery;
begin
   q := TsqlQuery.Create(Self);
   try
      q.SQLConnection := Conec; //así se llama la conexión
      try 
         q.Sql.Add('select CampoX From Tabla1');
         q.Open;
      except
         q.Sql.Add('ALTER TABLE Tabla1 ADD COLUMN CampoX tipo_dato');
         q.ExecSQL;
      end;
   finally
      q.Free;
   end;
end;
En tu caso debes añadir como rellenar el campo después de crearlo.

Saludos
__________________
La Madurez se llama...
~~~Gaia~~~

Última edición por ozsWizzard fecha: 20-03-2013 a las 13:44:51.
Responder Con Cita
  #10  
Antiguo 20-03-2013
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 22
apicito Va por buen camino
Al final lo he solucionado así:
Código SQL [-]
 SELECT distinct FRAS_CONF1_DATA AS FECHAR,
 FRAS_CODIGO, FRAS_DATA, FRAS_NUMERO, .... 
 FROM FRAS
 where
 FRAS_CONF1_DATA > '02/18/2013'

 union ALL

 SELECT distinct FRAS_CONF2_DATA AS FECHAR,
 FRAS_CODIGO, FRAS_DATA, FRAS_NUMERO, ....
 FROM FRAS
 where
 FRAS_CONF2_DATA > '02/18/2013'

  union ALL

 SELECT distinct FRAS_CONF3_DATA AS FECHAR,
FRAS_CODIGO, FRAS_DATA, FRAS_NUMERO, ...
 FROM FRAS
 where
 FRAS_CONF3_DATA > '02/18/2013'

 ORDER BY 1,4
Gracias por vuestra ayuda.
un saludo.
Responder Con Cita
  #11  
Antiguo 20-03-2013
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 22
apicito Va por buen camino
En la solución anterior sobra el distinct, ya que no cumple ninguna función. El campo FECHAR es timestamp y por lo tanto siempre es distinto y hace que si esa factura la conformaron dos personas en el perído de consulta muestre dos registros.
Al principio pensé que era un problema, pero pensandolo bien, como el objetivo de esta consulta es mostrarle al encargado los eventos que se produjeron en un período, no está mal que pueda ver que recibió dos conformidades o rechazos.
Saludos.
Responder Con Cita
  #12  
Antiguo 20-03-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
No soy experto en SQL, pero usando una expresión Case en el Order By podría bastar. Hice esta pequeña prueba con una de mis tablas y funcionó:
Código SQL [-]
Select ID, Fecha, FechaEjecucion From OrdenTrabajo
  Order By
    Case
      When Fecha < FechaEjecucion Then Fecha
      Else FechaEjecucion
    End
Como FechaEjecucion puede ser Null, añadiendo "Nulls First", hacemos que la consulta traiga primero los registros que tienen vacío ese campo:
Código SQL [-]
Select ID, Fecha, FechaEjecucion From OrdenTrabajo
  Order By
    Case
      When Fecha < FechaEjecucion Then Fecha
      Else FechaEjecucion
    End Nulls First
En tu caso el Case involucraría tres campos. Sería un poco más grande, pero nada del otro mundo.
Responder Con Cita
  #13  
Antiguo 21-03-2013
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 22
apicito Va por buen camino
Con la solución que postee: "order by 1,4" ya funciona correctamente la ordenación. Ordena por el campo FECHAR y FRAS_NUMERO.
Realmente el único "fallo" que le encuentro es que no permite hacer distinc excluyendo FECHAR y que hace que puedan aparecer más de una linea de la misma factura si fue conformada por más de una persona en el período de la consulta.
Saludos.
Responder Con Cita
Respuesta



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
Manejo de Fechas de vencimiento en delphi 7 luisraad Varios 92 11-04-2013 23:33:40
Ayuda sobre manejo de fechas francodelphi Conexión con bases de datos 12 27-10-2011 01:22:15
Manejo de Fechas en Firebird 2.1 Jose Roman SQL 3 17-02-2009 17:15:03
Manejo de fechas nazly Varios 2 14-03-2008 19:05:23
Manejo de fechas Leogiro OOP 2 11-09-2004 00:22:39


La franja horaria es GMT +2. Ahora son las 08:51:20.


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