Buscar un valor en un campo TIMESTAMP de Firebird

491 views
Skip to first unread message

Ultraton500

unread,
Jun 16, 2021, 7:11:31 AM6/16/21
to Comunidad de Visual Foxpro en Español
Buen día a todos.

Necesito ayuda para entender por qué no funciona esta consulta siendo que existe un registro con ese valor.

SELECT id_importa FROM importaciones WHERE fechayhora='06/13/2021 8:47:55'

El problema es el operador "=" ya que puedo obtener resultados si lo cambio por otros como "<" o "<=".

Desde ya agradezco sus comentarios.

Saludos cordiales.
Javier Pérez.

HernanCano

unread,
Jun 16, 2021, 8:27:29 AM6/16/21
to Comunidad de Visual Foxpro en Español
1. ¿Será que los segundos tienen decimales?
2. ¿Será que la hora necesita el cero con el ocho?
3. ¿Será que un formato no internacional (YYYY-MM-DD) es difícil reconocerlo (no se sabe si empieza por mes o por día)?

De acuerdo a la info suministrada (...puedo obtener resultados si lo cambio por ..."<"...) la apreciación 1 es muy probable.

Ultraton500

unread,
Jun 17, 2021, 3:02:59 AM6/17/21
to Comunidad de Visual Foxpro en Español
Hola Hernan, gracias por responder.

El ejemplo que puse con el mes sin el cero no es el mejor pero el problema no está en el formato ya que con los operadores  "<", ">" y "<>" se obtienen los resultados correctos. En cambio, hay un problema con el "=" ya que no solo no funciona cuando se lo usa solo sino que cuando está acompañado de un operador "menor que" o "mayor que" (de esta forma: "<=" o ">=") el resultado es como si solo estuviesen los operadores "<" o ">"... es extraño.

Se me ocurrió consultar el foro del blog de Walter Ojeda (http://yoforeo.com/firebird21/index.php) pero aparentemente no existe mas.

Saludos cordiales.
Javier Pérez.

HernanCano

unread,
Jun 17, 2021, 7:33:15 AM6/17/21
to Comunidad de Visual Foxpro en Español
Por favor, colega:

1. ¿Será que los segundos tienen decimales?

en el renglón en el que tienes esa fechahora.....

¿Puedes enviar una imagen del contenido donde se vean esos datos "completos" (fecha y hora sin recortar)?

ggcagnola gmail

unread,
Jun 17, 2021, 7:35:10 AM6/17/21
to publice...@googlegroups.com


utilizá segundos o milisegundos en ambas expresiones de la comparación

--
Visita el Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/0997a61f-3fb1-49d7-b2e8-61456538dca5n%40googlegroups.com.

Libre de virus. www.avast.com

Víctor Hugo Espínola Domínguez

unread,
Jun 17, 2021, 1:18:43 PM6/17/21
to publice...@googlegroups.com
>SELECT id_importa FROM importaciones WHERE fechayhora='06/13/2021 8:47:55'

Esa consulta la haces desde VFP o desde un administrador?

Saludos,
Víctor.
Lambaré - Paraguay.



--
Visita el Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.

Ultraton500

unread,
Jun 18, 2021, 2:50:13 AM6/18/21
to Comunidad de Visual Foxpro en Español
Siguiendo sus recomendaciones probé la condición fechayhora='08/08/2016 17:46:30.000' (también con distintas cantidades de dígitos en los milisegundos y separado por ":") pero el resultado es el mismo. Adjunto una captura de los datos visualizados en SQLManager que es donde también realizo la consulta además de hacerla desde VFP.

fechayhora1.jpg

Otro comportamiento extraño es que con la condición fechayhora < '08/08/2016 17:46:30' (es decir: fechayhora menor que el valor del 2do. registro) obtengo el 1er. registro como es de esperar, pero con la condición fechayhora < '07/07/2016 17:46:30' no obtengo nada siendo que el valor del 1er. registro cumple con ambas condiciones.

Sigo investigando pero no encuentro un ejemplo de comparación como la de este caso.

Saludos y gracias nuevamente.
Javier.

HernanCano

unread,
Jun 18, 2021, 3:30:12 AM6/18/21
to Comunidad de Visual Foxpro en Español
Amigo:
¿Qué te pasa?
No hablo es escribir ceros en los decimales de la consulta SQL.
Me refería a que si el campo en la bdatos tenía decimales en el campo FECHAYHORA en los segundos.

Veo en la imagen que no.

Pero se debiera confirmar si los tiene......

HernanCano

unread,
Jun 18, 2021, 3:37:29 AM6/18/21
to Comunidad de Visual Foxpro en Español
Estoy mirando la documentación de FireBird y encuentro que FireBird sí maneja milisegundos en los campos datetime.

Por lo tanto en VFP (mediante SQLEXEC()) no creo que puedas recibir los milisegundos.

Debes verificar el comando SQL que nos muestras (1) si lo estás ejecutando sobre el cursor que llega a VFP (luego de ejecutar SQLEXEC()), o (2) si lo estás ejecutando en FireBird (dentro del SQLEXEC()).


borrable.png

HernanCano

unread,
Jun 18, 2021, 3:50:33 AM6/18/21
to Comunidad de Visual Foxpro en Español
También debes estar seguro de cómo estás escribiendo la fecha.

Para ello te recomiendo leer las sgtes recomendaciones que Walter nos hace en su portal sobre ésto.

Te recomiendo que las fechas siempre las escribas en formato internaCIONal YYYY-MM-AA (ver la imagen) y de esa forma nunca habrá posibilidad de duda y/o error.

Evitando confusiones con las fechas

borrable.png

ggcagnola gmail

unread,
Jun 18, 2021, 7:53:01 AM6/18/21
to publice...@googlegroups.com

repito compará milisegundos en ambos lados de la comparación...

ggcagnola gmail

unread,
Jun 18, 2021, 7:53:08 AM6/18/21
to publice...@googlegroups.com

repito: compará milisegundos en ambos lados de la comparación...


El 18/06/2021 a las 3:50, Ultraton500 escribió:

Víctor Hugo Espínola Domínguez

unread,
Jun 18, 2021, 4:41:05 PM6/18/21
to publice...@googlegroups.com
1 de agosto de 2016 < 7 de julio de 2016 es verdad o mentira?


Saludos,
Víctor.
Lambaré - Paraguay.


HernanCano

unread,
Jun 19, 2021, 5:51:16 AM6/19/21
to Comunidad de Visual Foxpro en Español
Aclarando.........

>>> Otro comportamiento extraño es que con la condición fechayhora < '08/08/2016 17:46:30' (es decir: fechayhora menor que el valor del 2do. registro) obtengo el 1er. registro como es de esperar,....

Correcto, estamos de acuerdo.


>>> ....pero con la condición fechayhora < '07/07/2016 17:46:30' no obtengo nada siendo que el valor del 1er. registro cumple con ambas condiciones.

Mmmmmm... no estoy de acuerdo (este comentario va acorde con lo que te dice Víctor).
Si tú ves que la hora cumple, pues sí, es cierto, pero la fecha no... Por lo tato la respuesta final debe ser no.


El viernes, 18 de junio de 2021 a la(s) 01:50:13 UTC-5, Ultraton500 escribió:

HernanCano

unread,
Jun 19, 2021, 5:55:18 AM6/19/21
to Comunidad de Visual Foxpro en Español
Hola.

En el mismo SQLMANAGER, sobre la misma bdatos de la imagen que nos muestras, ejecuta lo sgte:

   
SELECT
                            FECHAYHORA ,
   EXTRACT(YEAR        FROM FECHAYHORA) AS AÑO,
   EXTRACT(MONTH       FROM FECHAYHORA) AS MES,
   EXTRACT(DAY         FROM FECHAYHORA) AS DIA,
   EXTRACT(HOUR        FROM FECHAYHORA) AS HORAS   ,
   EXTRACT(MINUTE      FROM FECHAYHORA) AS MINUTOS ,
   EXTRACT(SECOND      FROM FECHAYHORA) AS SEGUNDOS,
   EXTRACT(MILLISECOND FROM FECHAYHORA) AS MILISEG
FROM
   IMPORTACIONES
  
 (si de pronto SQLMANAGER o FireBird se confunden con la Ñ, escribe algo sin letras "especiales")

y nos pasas la imagen de lo que se observa.

Bien?


El viernes, 18 de junio de 2021 a la(s) 01:50:13 UTC-5, Ultraton500 escribió:

Ultraton500

unread,
Jun 20, 2021, 7:45:11 AM6/20/21
to Comunidad de Visual Foxpro en Español
Hernán: muchas gracias por lo que has investigado y las recomendaciones.
Siempre estuve haciendo la consulta a Firebird desde VFP (usando FoxyDB) y también desde el editor de SQL de SQLManager. Estuve usando el formato MM/DD/AAAA que funciona pero coincido en que es mejor usar el formato internacional.
Ejecuté la consulta que me indicaste y obtuve lo siguiente:

extraccion_timestamp.jpg
por lo tanto, para poder encontrar un registro determinado guardo en una variable la cadena con el formato aaaa-mm-dd hh:mm:ss.mmm:

lcFechaYHora = ALLTRIM(STR(cursor.anio)) + "/" + PADL(ALLTRIM(STR(cursor.mes)),2,"0") + "/" + PADL(ALLTRIM(STR(cursor.dia)),2,"0") + " " + PADL(ALLTRIM(STR(cursor.hora)),2,"0") + ":" + PADL(ALLTRIM(STR(cursor.minutos)),2,"0") + ":" + ; PADL(ALLTRIM(STR(INT(cursor.segundos))),2,"0") + "." + PADL(ALLTRIM(STR(cursor.miliseg)),3,"0")

para usarla en la consulta de la siguiente manera: WHERE fechayhora='" + lcFechaYHora + "' ORDER BY ... y de esta manera darle solución al problema.

En cuanto al "comportamiento extraño"... mi razonamiento parte de que un dato de tipo fecha y hora es para indicar un instante en el tiempo con una precisión que va desde el año al milisegundo y por lo tanto cualquier cambio en los elementos que lo precisan estarían indicando otro instante distinto (menor o mayor) cumpliéndose la condición < ó > respectivamente y eso es lo que ocurre ahora que incluí los milisegundos en la condición.

ggca: gracias por la sugerencia. Tal como me lo indicaste debía agregar los milisegundos en la comparación pero como SQLManager no los mostraba asumí que no los usaba y por eso terminé agregando ceros para probar porque no sabía qué poner en ese lugar.

Víctor: gracias por el aporte, es muy interesante el artículo, había visto que se usaba de esa manera pero no sabía por qué. 

Les agradezco mucho a los tres por su interés en ayudarme.

Saludos cordiales.
Javier Pérez.

HernanCano

unread,
Jun 21, 2021, 8:36:51 AM6/21/21
to Comunidad de Visual Foxpro en Español
Listo, colega.
Pero por favor aprende a escribir el comando que pusiste de esta manera:

lcFechaYHora = alltrim(str(    cursor.anio     ))         + "/" ; 
        + padl(alltrim(str(    cursor.mes      )),2,"0")) + "/" ; 
        + padl(alltrim(str(    cursor.dia      )),2,"0")) + " " ; 
        + padl(alltrim(str(    cursor.hora     )),2,"0")) + ":" ; 
        + padl(alltrim(str(    cursor.minutos  )),2,"0")) + ":" ; 
        + padl(alltrim(str(int(cursor.segundos))),2,"0")) + "." ; 
        + padl(alltrim(str(    cursor.miliseg  )),3,"0"))

Es más claro a la vista.

Y con respecto a 

>>> ... para usarla en la consulta de la siguiente manera: WHERE fechayhora='" + lcFechaYHora + "' ORDER BY ... y de esta manera darle solución al problema.

¿Cómo así: de dónde obtienes el valor de la FechaHora que necesitas para la consulta?
Es decir: haces un comando SELECT-SQL cuando quieres buscar los registros que tengan una FechaHora específica: ¿dónde está ese valor de FechaHora que controla la búsqueda?

La instrucción que te dí para sacar cada uno de los elementos de fecha y hora es para que tú descubras --si el registro que dices que debiera salir (estar incluido) en el cursor de respuesta-- tiene milisegundos que hacen que falle la instrucción.

En ésta última imagen no veo el registro que contiene '08/08/2016 17:46:30', que buscabas antes y que no salía cuando escribías  " fechayhora < '08/08/2016 17:46:30'  ": de que debe salir --con esa condición-- debe salir. Pero si no sale es por que debes analizar tú mismo (apoyándote en el script que te dí) si el registro en cuestión tiene milisegundos o no, en cuyo caso SI LOS MILISEGUNDOS SON MAYORES A 000, entonces no cumple la condición y por éso no sale. (como no das imagen de esos mismo registros no te puedo concluir).

Pero entonces aquí viene lo que debes captar de todo ésto:

Si en la base de datos hay un registro así: con FECHAYHORA que vale '08/08/2016 17:46:30.224', si hago la consulta 

select * from TABLADATOS where FECHAYHORA = '08/08/2016 17:46:30'

no sale el registro. Ya sabemos que es por que los segundos (y/o milisegundos) no son IGUALES.
¿Cómo se hace para que se cumpla la condición y que los registros --DE ESE DIA-- sí salgan en la consulta SQL que se ejecuta, aunque en el comando no se usen milisegundos, por que no se necesitan?

En datos VFP (DBF/DBC) sabemos hacerlo.... ¿Pero y en FireBird--- desde VFP?

(me muevo en VFP, mas no mucho en FireBird --aunq me gusta--; pero ésa es la idea de lo que debes afrontar; consulté, pero es tuyo el escenario).


Víctor Hugo Espínola Domínguez

unread,
Jun 21, 2021, 2:45:12 PM6/21/21
to publice...@googlegroups.com
Si lo que deseas es filtrar los datos por una fecha y las columnas son tipo datetime o similar usa este truco:

ldFecha = DATE(2021, 6, 13)
ltIni        = DTOT(ldFecha)
ltFin       = DTOT(ldFecha + 1) - 1

MESSAGEBOX("Desde " + TRANSFORM(ltIni) + " Hasta " + TRANSFORM(ltFin))

NOTE:  Where SqlColDateTime Between ?m.ltIni AND ?m.ltFin


Saludos,
Víctor.
Lambaré - Paraguay.


--
Visita el Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.

HernanCano

unread,
Jun 21, 2021, 4:22:56 PM6/21/21
to Comunidad de Visual Foxpro en Español
Qué bien, Víctor !!!   Súper esta propuesta !!!

Y va acorde con la idea de no escribir las fechas en formato de caracteres (string) empezando por día o mes (que me parece inadecuado y propenso a fallos).

(pero como javier ya tiene involucrada (HARD-CODED) la hora en el comando SQL ........................ habrá qué ver qué dice)

Ultraton500

unread,
Jun 22, 2021, 5:26:43 AM6/22/21
to Comunidad de Visual Foxpro en Español
El problema que he planteado surgió al intentar solucionar otro. Me ocurrió varias veces que un estado de una cotización se agregó duplicado e incluso triplicado a la db en todos sus campos excepto el id.  Esto pasó en varios usuarios, cada uno con su propia db. Como es algo que sucede solo algunas veces y no tengo idea de cuál es la causa se me ocurrió agregar temporalmente un código para verificar, inmediatamente después de la inserción, si existen duplicados. Es decir, hago un SELECT para obtener el registro que se acaba de insertar y de ahí es que salen los los datos para el SELECT que me va a indicar si está duplicado o no.
Con lo aprendido aquí he podido ver que los duplicados a veces difieren en los milisegundos por lo que no voy a poder aplicar la solución que indiqué anteriormente sino que voy a tener que ejecutar la siguiente consulta:

SELECT * FROM estados_log WHERE EXTRACT(YEAR FROM fechayhora)=?lnAnio AND EXTRACT(MONTH FROM fechayhora)=?lnMes AND EXTRACT(DAY FROM fechayhora)=?lnDia AND EXTRACT(HOUR FROM fechayhora)=?lnHora AND EXTRACT(MINUTE FROM fechayhora)=?lnMinutos AND EXTRACT(SECOND FROM fechayhora)=?lnSegundos

en donde las variables se cargan con los respectivos valores del registro agregado en el último INSERT.

Es justamente por el problema que ahora me queda por resolver que no solo necesito obtener los datos de un día en particular sino también de una hora, minuto y segundo en particular, por eso no voy a poder aplicar lo que me has sugerido Víctor aunque he tomado nota para tenerlo en cuenta al igual que tu recomendación Hernán para organizar mejor el código.

Con respecto a que en la última imagen no se ve el registro que contiene '08/08/2016 17:46:30' ... elegí una porción del resultado de la consulta en donde pueden apreciarse otros ejemplos con distinto número de dígitos en los milisegundos.

Nuevamente muchas gracias.

Saludos.
Javier.

HernanCano

unread,
Jun 23, 2021, 3:41:10 PM6/23/21
to Comunidad de Visual Foxpro en Español
Listo.
Un gusto haber podido ayudarte.
Reply all
Reply to author
Forward
0 new messages