Sumar dos horas de diferente tabla Mysql

Skip to first unread message

Vic

unread,
Jun 22, 2021, 3:49:06 PM6/22/21
to ado-h...@googlegroups.com

Hola a tod@s:

    Necesito guardar en un campo declarado como TIME el valor que contiene dicho campo más la suma de la siguiente operación:

    *.- La diferencia de dos horas más el valor actual de dicho campo TIME.

    Por ejemplo:

  1. El valor actual del campo TIME es 1:00:00
  2. En otra tabla tengo en un campo TIME lo siguiente 21:30:00
  3. En tiempo de ejecución en una variable se guarda la hora actual(la variable se asigna de la siguiente forma tTiempo := TIME()).

    La idea es realizar un UPDATE con la diferencia de horas entre 2 y 3 y dicha diferencia sumársela al contenido de 1

    Seria... Diferencia(3-2)+1 y lo dejamos en 1

    He intentado lo siguiente pero da error así como difernetes formas encontradas en la red que no se ajustan a lo que necesito...

    UPDATE Perm_Horatotal SET ADDTIME(Perm_Horatotal,TIME_DIFF(cControl:Cont_Horaent,tTiempo )) FROM EMPRESA")

    Donde:

  • Perm_Horatotal sería el campo donde se guardaría el acumulado de horas
  • cControl:Cont_Horaent sería el campo de una de las tablas usadas
  • tTiempo seria la hora asignada a dicha variable mediante TIME()

    He revisado diferentes ejemplos en la red pero realmente me estoy liando sin llegar a una solución correcta.

    No me importa que las horas se vayan acumulando hasta valores altos como podrían ser 240 horas o mas, tampoco se si se podría hacer q en vez de acumular las correspondientes horas, se pudiera guardar con el formato X días y X horas, es decir que cuando se llegue a 24 horas se sume un día

    ¿Alguien me podría orientar?

    Un saludo.

Nippur Lagash

unread,
Jun 22, 2021, 4:35:14 PM6/22/21
to ado-h...@googlegroups.com
Hola Vic, entre EMPRESA y )  hay " ->eso creo que sobra, salvo que te haya quedado de algún otro códiigo:
UPDATE Perm_Horatotal SET ADDTIME(Perm_Horatotal,TIME_DIFF(cControl:Cont_Horaent,tTiempo )) FROM EMPRESA")
                                                                                                                                                                                                      ^  
Saludos,
Fer.MDQ

--
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/b80453ad-b29d-257a-7324-ce7c02fa33d8%40gmail.com.


--
Nippur
Mar del Plata
Buenos Aires
Argentina

David Field

unread,
Jun 22, 2021, 5:26:23 PM6/22/21
to ADO Harbour
Vicente,

La sintaxis está incorrecta.
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;


Saludos,
David Field

Vic

unread,
Jun 23, 2021, 2:34:19 PM6/23/21
to ado-h...@googlegroups.com

Hola a tod@s:

    Después de usar la sintaxis correcta, la línea quedaría así...

oConn:Execute("UPDATE PERMISOS set Perm_Horatotal = ADDTIME(Perm_Horatotal,TIMEDIFF('"+TIME()+"',cControl:Cont_Horaent)")

    Pero dicha línea me da un error...

Subsystem Call ..............: WINOLE
System Code .................: 1007
Default Status ..............: .F.
Description .................: [MySQL][ODBC 5.3(a) Driver][mysqld-5.5.5-10.1.40-MariaDB]You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ':Cont_Horaent)' at line 1 (0x80040E14)
Operation ...................: EXECUTE
Arguments ...................:  [ 1] = Type: C Val: UPDATE PERMISOS set Perm_Horatotal = ADDTIME(Perm_Horatotal,TIMEDIFF('20:28:48',cControl:Cont_Horaent)
Involved File ...............: Microsoft OLE DB Provider for ODBC Drivers
Dos Error Code ..............: -2147352567

    El error se produce en la línea indicada y al ver el contenido del campo cControl:Cont_Horaent(que está definido como TIME) veo que su contenido es algo parecido esto 2021-06-23 20:31:53, entiendo que eso sería un DATETIME y revisando que valor se guarda en dicho campo veo que hay una hora del estilo a 15:32:45.

    ¿Qué estoy pasando por alto o que estoy haciendo mal?

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.

avazq...@gmail.com

unread,
Jun 23, 2021, 2:48:04 PM6/23/21
to ado-h...@googlegroups.com

Creo que te falta un paréntesis

oConn:Execute("UPDATE PERMISOS set Perm_Horatotal = ADDTIME(Perm_Horatotal,TIMEDIFF('"+TIME()+"',cControl:Cont_Horaent))")

 

 

Antonio Vázquez

avazq...@gmail.com

Vic

unread,
Jun 23, 2021, 3:37:35 PM6/23/21
to ado-h...@googlegroups.com

    Gracias Antonio, de eso ya me había dado cuenta después de enviar el correo.

    He cambiado la instrucción por lo siguiente...

      oConn:Execute("UPDATE PERMISOS set Perm_Horatotal = ADDTIME(Perm_Horatotal,TIMEDIFF('"+TIME()+"','"+cControl:Cont_Horaent+"'))")

    Y sigue con el error y aquí se v ve lo que ya indiqué...

Subsystem Call ..............: BASE
System Code .................: 1081
Default Status ..............: .F.
Description .................: Error de argumento
Operation ...................: +
Arguments ...................:  [ 1] = Type: C Val: UPDATE PERMISOS set Perm_Horatotal = ADDTIME(Perm_Horatotal,TIMEDIFF('21:33:26',' [ 2] = Type: T Val: t"2021-06-23 21:33:19"
Involved File ...............:
Dos Error Code ..............: 0

    El campo cControl:Cont_Horaent(que es de otra tabla y definido como TIME y cuyo valor guardado es 21:33:19) me carga la fecha y la hora como si fuera un DATETIME... sigo sin saber por que hace esto.

    Un saludo.

David Field

unread,
Jun 23, 2021, 4:50:30 PM6/23/21
to ADO Harbour
Vicente,

La razón por la que el campo  cControl:Cont_Horaent te sale como DATETIME es por que en Harbour no existe variable de tipo TIME.
Si tu checas el tipo de variable que regresa la función de Harbour TIME() el resultado es de tipo STRING.
xHarbour Language Reference Guide (Version 1.1) - Time() Time() --> cHHMMSS

Intenta con lo siguiente:oConn:Execute("UPDATE PERMISOS set Perm_Horatotal = ADDTIME(Perm_Horatotal, '"+ELAPTIME( TIME(), TimePart(cControl:Cont_Horaent))+")")

Function TimePart(dDate) // Devuelve hora y minutos de un DATETIME()
*-----------------------------------------------------------------------------*
Return STRZERO(Hour(dDate),2)+":"+STRZERO(Minute(dDate),2)

ELAPTIME() es función de Harbour que te regresa la diferencia de tiempo entre una hora y otra
xHarbour Language Reference Guide (Version 1.1) - ElapTime() ElapTime( <cStartTime>, <cEndTime> ) --> cElapsedTime

Timepart() es una función que me encontré por ahí (o tal vez mía, no recuerdo) que devuelve la porción de hora de un DATETIME

Saludos,
David Field

PD. Un consejo a todos los que usen MySQL y/o MariaDB:
Será común que el día de mañana utilicen algún servidor en la nube, y los basados en LINUX son las más económicos pero son muy quisquillosos en cuanto a mayúsculos y minúsculas por lo que les recomiendo SIEMPRE codificar TAL CUAL están los nombres de los campos y tablas.
En mi caso he decidido que TODOS son con minúsculas y así evito problemas al transferir de un servidor WINDOWS a uno LINUX

David Field

unread,
Jun 23, 2021, 5:00:10 PM6/23/21
to ADO Harbour
Vicente,

Otra cosa importante, comentas que no importa si las horas llegan a ser 240... esto no es posible con un campo de tipo TIME en SQL.
Este tipo de campo SOLO acepta valores de 00:00:00 a 23:59:59 y si el valor está fuera de este rango te mandará error.

Si lo que quieres es que te guarde un acumulado de tiempo, sugiero que utilices un campo de tipo INT y que guardes las horas y minutos (y tal vez hasta los segundos) en segundos que siempre podrás convertir de/o a días, horas, minutos y segundos. (y quizá sea hasta más sencillo el trabajar con funciones SQL de sumas y restas, sumatorias, etc.)

Saludos,
David Field

Vic

unread,
Jun 25, 2021, 12:20:40 PM6/25/21
to ado-h...@googlegroups.com

    Tienes toda la razón David, pese a que en un principio se guardan los datos... luego da error. Al final me he decidido por un INT y guardar la información en segundos ya que como me indicas es una buena forma para luego hacer cálculos y pasarlo al formato que me interese.

    Un saludo.

Reply all
Reply to author
Forward
0 new messages