Sumar fechas en Mysql

106 views
Skip to first unread message

Vicente C.

unread,
Jul 5, 2023, 1:23:23 PM7/5/23
to ado-h...@googlegroups.com, oo...@googlegroups.com

Buenas tardes a tod@s:

    Tengo definido un campo en una tabla en la que guardo tiempo en formato de horas con un campo TIME que admite horas desde -838:59:59 a 839:59:59 según la documentación,

    En dicho campo tengo que ir guardando ciertos periodos de tiempo que tardan una serie de procesos y luego sumarlo a lo que ya hay en dicho campo definido.Dicho proceso de guardado lo hago de la siguiente forma:

    Update dblicempresa set Reg_uso = ADDTIME(Reg_uso , tDiferencia)

    Donde:

  • Reg_uso es donde se va acumulando el tiempo según se van realizando procesos.
  • tDiferencia es el resultado de otra consulta...       oTiempo := ADODB("Select TIMEDIFF(CurTime(),Cont_Horaact) AS tDiferencia from dbcontrol") también he probado con oTiempo := ADODB("Select SEC_TO_TIME(TIMEDIFF(CurTime(),Cont_Horaact)) AS tDiferencia from dbcontrol")

    El problema es que al ejecutar dicha orden desde mi aplicación da el siguiente error:

    Update dblicempresa set Reg_uso = ADDTIME(Reg_uso,TIME(' [ 2] = Type: T Val: t"2023-07-05 00:00:07"

    Se supone que si uso SEC_TO_TIME() me lo deja en "00:00:07" pero no es así desde la aplicación.

    Si ejecuto esas ordenes en HeidiSql funciona sin problemas pero... por que tDiferencia la ponga para las pruebas por ejemplo "00:00:10" no tiene asignada la fecha.

    ¿Alguna idea/sugerencia de como poder realizar ese cálculo y que sea sumado al tiempo ya existente?

    Un saludo.

David Field

unread,
Jul 6, 2023, 9:19:22 PM7/6/23
to ADO Harbour
Hola Vicente,

Si te funciona bien utilizando HeidiSQL entonces te recomiendo realizarlo de esa manera.
oConn:Execute(" Update dblicempresa set Reg_uso = ADDTIME(Reg_uso , Select TIMEDIFF(CurTime(),Cont_Horaact) from dbcontrol)")

Algunas notas al margen:
Que yo sepa, Harbour no tiene un tipo de variable que sea de tiempo, solo de fecha y hora.
Las funciones de harbour que te regresan la parte de la hora de una variable de fecha te lo regresan en numerico o caracter.
Por lo tanto, oTiempo := ADODB("Select TIMEDIFF(CurTime(),Cont_Horaact) AS tDiferencia from dbcontrol") te regresa oTiempo:tDiferencia como fecha.

Espero esto te ayude.

Saludos,
David Field

Vicente C.

unread,
Jul 8, 2023, 1:08:25 PM7/8/23
to ado-h...@googlegroups.com

Buenas tardes David:

    Con tu respuesta tengo un error "importante", como comenté son datos tomados de dos bases de datos con dos conexiones diferentes:

  • dblicempresa y Reg_usopertenecerían a la conexión oConnReg.
  • dbcontrol y Cont_Horaact a la conexión oConn

    Con lo cual lo primero sería cambiar la conexión a tu solución: oConnReg:Execute(" Update dblicempresa set Reg_uso = ADDTIME(Reg_uso , Select TIMEDIFF(CurTime(),Cont_Horaact) from dbcontrol)")

    Con eso me devuelve un error totalmente lógico que es que dbcontrol no existe ya que dicha tabla está en otra conexión. En la aplicación en ese punto hay dos conexiones diferentes a dos bases de datos alojadas en dos servidores diferentes(en el futuro puede que estén en el mismo servidor pero seguirían s¡endo dos bases de datos separadas.

    Un saludo.

David Field

unread,
Jul 8, 2023, 2:22:48 PM7/8/23
to ADO Harbour
Vicente,

En tu primer post dices que funciona correctamente utilizando HeidiSQL.
¿Cómo lo haces?

Saludos,
David Field

Vicente C.

unread,
Jul 8, 2023, 6:42:56 PM7/8/23
to ado-h...@googlegroups.com

Buenas noches David:

    Con que funcionaba correcto en Heidi... me refería a la suma de las horas ya que la prueba la hacia sumando "00:00:07"  a la hora guardada... eso así si funciona y respeta lo que permite TIME en MySql. Lo que no funciona es con la instrucción descrita o con la que me has proporcionado, en ese caso por tomar datos de dos bases de datos diferentes las cuales están alojada sen servidores diferentes.

    Si lo guardo en variables da el error al guardar el acumulado ya que no me respeta la configuración de TIME y toma como horas... las 24 horas naturales de un dia en vez de los posibles 838 posibles horas.

    Un saludo.

--
Has recibido este mensaje porque estás suscrito al grupo "ADO Harbour" 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 ado-harbour...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/ado-harbour/17ad2da2-908d-45f1-841e-94cfeb98a186n%40googlegroups.com.

Nippur Lagash

unread,
Jul 10, 2023, 11:00:37 AM7/10/23
to ado-h...@googlegroups.com
Hola Vic, si ambas bases están en el mismo servidor, no lo podes solucionara nivel mysql:
base: test
tabla: pruebas
image.png

ahora creo otra base y otra tabla en el mismo servidor:
base: test2
tabla: pruebas2

image.png

con esta query inserto en la nueva base/tabla la diferencia de los campos hora1 y hora2 de test/pruebas:

insert into test2.pruebas2 (select time(hora2-hora1) diferencia FROM test.pruebas);

Es un ejemplo básico, pero lo podes adaptar a tu problema, la papa está en pone delante de la tabla, la base de datos:
select database.table 

Saludos,
Fer.MDQ



--
Nippur
Mar del Plata
Buenos Aires
Argentina

Nippur Lagash

unread,
Jul 10, 2023, 12:02:20 PM7/10/23
to ado-h...@googlegroups.com
Fe de erratas
" no lo podes solucionara nivel mysql:"
quise decir que sí, lo puedes solucionar a nivel mysql.

Saludos,Fer.MDQ

David Field

unread,
Jul 10, 2023, 12:32:46 PM7/10/23
to ADO Harbour
Vicente,

Mi ejemplo de cómo solucionarlo es solo eso, un ejemplo, no necesariamente la solución, y en tu primer post no indicaste que el datos provenía de otro servidor/base de datos.

Por tu respuesta entiendo que ADDTIME(Reg_uso , "00:00.07") funciona. Es correcto?
De ser correcto, te sugiero que extraigas la hora, minutos y segundos de la fecha y armes la cadena "00:00.07".
Harbour tiene las funciones Hour(), Minutes(), Secs() para extraer los datos de una variable DateTime.

Espero que esto te ayude, de lo contrario, muéstranos el comando que te funciona en HeidiSQL, el valor de la variable Reg_uso y el valor de la variable tDiferencia.

Saludos,
David Field
Reply all
Reply to author
Forward
0 new messages