Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Buscar en una tabla por fecha (https://www.clubdelphi.com/foros/showthread.php?t=95109)

Angel.Matilla 09-03-2021 11:42:23

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?

kuan-yiu 09-03-2021 13:29:07

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.

ecfisa 09-03-2021 13:47:09

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 :)

mamcx 09-03-2021 15:35:48

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.

Angel.Matilla 09-03-2021 19:51:42

Gracias por la ayuda.
Cita:

Empezado por kuan-yiu (Mensaje 540298)
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 (Mensaje 540299)
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 (Mensaje 540300)
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.

kuan-yiu 10-03-2021 08:19:29

En Delphi están en SysUtils y DateUtils.

mamcx 10-03-2021 16:22:52

Cita:

Empezado por Angel.Matilla (Mensaje 540304)
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.

Angel.Matilla 10-03-2021 17:39:58

Cita:

Empezado por mamcx (Mensaje 540315)
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.


La franja horaria es GMT +2. Ahora son las 16:25:44.

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