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 09-03-2021
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Buscar en una tabla por fecha

Buenas. Tengo una tabla en FB con la siguiente estructura:
Código SQL [-]
CREATE TABLE Ficheros (Fichero VARCHAR(512) NOT NULL, Creado TIMESTAMP NOT NULL)
que tiene, por ejemplo, estos registros:

Como veis son nombres de copias de seguridad y lo que estoy buscando es que me saque todas las que se hayan hecho en una día concreto. Para ello uso este query:
Código:
Auxiliar->Close();
Auxiliar->SQL->Text = "SELECT Fichero FROM Ficheros WHERE CodPrv = :CodPrv AND Tipo = '2' AND Creado BETWEEN :Inicio AND :Final";
Auxiliar->ParamByName("Inicio")->AsDateTime = FileDateToDateTime(FileAge(cAux)).CurrentDate();
Auxiliar->ParamByName("Final")->AsDateTime  = FileDateToDateTime(FileAge(cAux));
Auxiliar->Open();
donde cAux es el nombre de la copia que acaba de crearse. Yo sé que, por ejemplo, hay 8 copias hechas hoy día 9 pero al ejecutar el query me devuelve cero registros. ¿Puede tener algo que ver que el campo Creado esté definido como TIMESTAMP o puede haber otra razón?
Responder Con Cita
  #2  
Antiguo 09-03-2021
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
Tienes que ajustar el margen de fechas: desde el primer minuto del día hasta el último.
Construye el rango a partir de la fecha que deseas y modifica la parte del tiempo según necesites, lo normal es truncar la parte decimal de ese tipo TDateTime y así tienes el primer segundo del día y luego añadirle 23h, 59 minutos y 59 segundos para tener el último segundo del día.
EncodeDateTime, EncodeTime, EndOfADay... tienes varias funciones para hacerlo.
Responder Con Cita
  #3  
Antiguo 09-03-2021
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Prueba de este modo:
Código SQL [-]
SELECT FICHERO
FROM FICHEROS
WHERE CAST(CREADO AS DATE) BETWEEN CAST(:INICIO AS DATE) AND CAST(:FINAL AS DATE)
(No incluí a CodPrv ni a Tipo por que no se hallan en la definición de la tabla)

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 09-03-2021
Avatar de mamcx
mamcx mamcx is online now
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Si mostraras los datos seria mas evidente el problema, aunque en mi opinion la descripción de lo que quiere y el código que muestras no coincide.
__________________
El malabarista.
Responder Con Cita
  #5  
Antiguo 09-03-2021
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Gracias por la ayuda.
Cita:
Empezado por kuan-yiu Ver Mensaje
Tienes que ajustar el margen de fechas: desde el primer minuto del día hasta el último.
Esa era la idea que tenía pero no encontraba como hacerlo. Varias de las funciones que me has aconsejado (StartOfADay, EndOfADay, etc.) no las conocía con el agravante de que en la ayuda de Builder no indica cual es el fichero de cabecera que hace falta (dateutils.hpp) o yo no loo he visto. No obstante he probado varias combinaciones y no me daba ningún resultado el query.
Cita:
Empezado por ecfisa Ver Mensaje
Código SQL [-]
SELECT FICHERO
FROM FICHEROS
WHERE CAST(CREADO AS DATE) BETWEEN CAST(:INICIO AS DATE) AND CAST(:FINAL AS DATE)
Al final este ha sido el que me ha funcionado.
Cita:
Empezado por mamcx Ver Mensaje
Si mostraras los datos seria mas evidente el problema, aunque en mi opinion la descripción de lo que quiere y el código que muestras no coincide.
No entiendo lo que quieres decir. He mostrado los datos que contiene la tabla; los del query no podía porque no devolvía ningún resultado. Creí que loo había dicho.
Responder Con Cita
  #6  
Antiguo 10-03-2021
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
En Delphi están en SysUtils y DateUtils.
Responder Con Cita
  #7  
Antiguo 10-03-2021
Avatar de mamcx
mamcx mamcx is online now
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por Angel.Matilla Ver Mensaje
No entiendo lo que quieres decir. He mostrado los datos que contiene la tabla; los del query no podía porque no devolvía ningún resultado. Creí que loo había dicho.
Tienes razón, no fui muy claro: Me refiero a los datos antes y DESPUES de las conversiones.

P.D: Ten en cuenta que el uso de CAST anula los indices* (Nota: eso es lo que pasa normalmente pero habría que chequear con el query planer!) y que yo sepa no es posible crear indices parciales/de funciones en firebird.

Por lo que en ese caso haces DOBLE cast para pasar de DATE a DATETIME or quitas/agregas/redondeas las horas del date time.
__________________
El malabarista.
Responder Con Cita
  #8  
Antiguo 10-03-2021
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por mamcx Ver Mensaje
Tienes razón, no fui muy claro: Me refiero a los datos antes y DESPUES de las conversiones.

P.D: Ten en cuenta que el uso de CAST anula los indices* (Nota: eso es lo que pasa normalmente pero habría que chequear con el query planer!) y que yo sepa no es posible crear indices parciales/de funciones en firebird.

Por lo que en ese caso haces DOBLE cast para pasar de DATE a DATETIME or quitas/agregas/redondeas las horas del date time.
Gracias por las aclaraciones. La solución de ecfisa me vale porque en el índice de la tabla no está la fecha y necesito únicamente la fecha del día; no hago búsquedas más allá porque el objetivo es que haya una única copia de seguridad por día. Por otra parte, lo que comentas de las cabeceras SysUtils y DateUtils ambas están en Builder, lo que pasa que la segunda de ellas nunca me ha hecho falta y como en la ayuda no la citan ni me había preocupado de buscarla.
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
Ordenar por la última fecha en varios campos de fecha de una tabla Luis M. Firebird e Interbase 1 22-03-2016 15:31:17
recorrer una tabla para buscar alguna fecha especifica Rofocale Varios 7 04-10-2011 17:33:48
buscar entre fecha y horas anubis SQL 2 01-01-2011 11:09:57
Buscar fecha en una tabla access dmassive Tablas planas 5 24-01-2008 19:24:07
Buscar por fecha.....ayuda!!! ronimaxh Firebird e Interbase 6 18-08-2004 14:38:29


La franja horaria es GMT +2. Ahora son las 22:34:52.


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