Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   sql server entero a time (https://www.clubdelphi.com/foros/showthread.php?t=57110)

Gaim2205 05-06-2008 18:25:02

sql server entero a time
 
Hola amigos, tengo una tabla donde se almacenan horarios de entrada y salida de trabajadores y quiero hacer una simple resta hora de entrada - hora de salida. El problema es que estos datos estan almacenados en campos de tipo entero por lo que una resta, por ejemplo:

19.00 - 8.20 = 10.8

y lo que yo quiero es obviamente que me devuelva en formato tiempo.

19.00 - 8.20 = 10.40 (diez horas, cuarenta minutos)

como puedo hacer esto con instrucciones sql en sql server 2000??
Muchas Gracias...

BlueSteel 05-06-2008 18:42:05

Cita:

Empezado por Gaim2205 (Mensaje 291556)
Hola amigos, tengo una tabla donde se almacenan horarios de entrada y salida de trabajadores y quiero hacer una simple resta hora de entrada - hora de salida. El problema es que estos datos estan almacenados en campos de tipo entero por lo que una resta, por ejemplo:

19.00 - 8.20 = 10.8

y lo que yo quiero es obviamente que me devuelva en formato tiempo.

19.00 - 8.20 = 10.40 (diez horas, cuarenta minutos)

como puedo hacer esto con instrucciones sql en sql server 2000??
Muchas Gracias...

Creo que debes convertir el entero a tipo hora... y realizar la resta de las horas con algun parametro

Yo lo que realizo es almacenar la fecha y hora en un mismo campo....si bien los datos que me llegan de la captura son de tipo string y entero, los transformo de la sgte forma

Con la siguiente funcion convierto los datos que vienen así

Fecha : 20080605
Hora :1341

a esto '06/06/2008 13:41:00'

Código Delphi [-]
     cYear   := StrToInt(Copy(DTexto.FieldByName('Fecha').asString,1,4));
     cMes    := StrToInt(Copy(DTexto.FieldByName('Fecha').asString,5,2));
     cDia    := StrToInt(Copy(DTexto.FieldByName('Fecha').asString,7,2));
     cHora   := StrToInt(Copy(DTexto.FieldByName('Hora').asString,1,2));
     cMinuto := StrToInt(Copy(DTexto.FieldByName('Hora').asString,3,2));
     cFecha := encodedate(cYear, cMes, cDia);
     cTime := encodetime(cHora, cMinuto, 0, 0);
     ReplaceTime(cFecha, cTime);

desde SQL utilizo lo siguiente para separar la fecha y la hora del campo Fecha (Acuerdate que la fecha y la hora estan en el mismo campo)

Código SQL [-]
 
CONVERT(Char(10), Hor_Fecha, 103) As Fecha
CONVERT(Char(8), Hor_Fecha, 108) As Hora'
en delphi puedes utilizar esto
Código Delphi [-]
MinutesBetween(Sal2,Ent2)
lo que te devolverá la cantidad de minutos que hay entre 2 horas (despues realizas el calculo de cuantas horas y minutos corresponderian...

Bueno, espero que esto te sirva.. o al menos te oriente

Salu2:p:D

Gaim2205 05-06-2008 18:49:49

Hola, gracias por tu respuesta, lamentablemente estas tablas se han venido utilizando desde mucho antes que yo llegara aqui, y como mencioné en mi post anterior las horas de entrada y salida se almacenan en campos de tipo entero, la fecha esta almacenada en un campo aparte.

Algo que seria facil, aunque no se si exista es un cast que convierta mi entero 10.2 por ejemplo, a 10:20:00 (formato time, sin date) :confused:

Con esto ya podria yo realizar la resta entre 2 times. Espero haberme dado a entender, recordar que quiero hacerlo solo mediante SQL, sin involucrar delphi por el momento.

Edito: Lo pense, y si me interesa tambien saber como convertir un dato decimal (hasta ahora habia dicho entero y puesto ejemplos con decimales duuuh, disculpen ustedes) a la parte time de un campo datetime :confused:. Espero haberme dado a entender y muchas gracias...

poliburro 05-06-2008 21:15:18

Código SQL [-]
-- =============================================
-- Create scalar function (FN)
-- =============================================
IF EXISTS (SELECT * 
     FROM   sysobjects 
     WHERE  name = N'')
  DROP FUNCTION CalculaTiempo
GO

CREATE FUNCTION CalculaTiempo(@ValHoraIni as Numeric(4,2), @ValHoraFin as Numeric(4,2))
RETURNS Char(8)
AS
BEGIN


Declare
   @HorIni Integer,
   @MinIni Integer,
   @HorFin Integer,
   @MinFin Integer,
   @TimeIni DateTime,
   @TimeFin DateTime

   Set @HorIni  = ROUND(@ValHoraIni, 0, 1)
   Set @MinIni = (@ValHoraIni - @HorIni) * 100

   Set @HorFin  = ROUND(@ValHoraFin, 0, 1)
   Set @MinFin = (@ValHoraFin - @HorFin) * 100
   Set @TimeIni = Convert(Datetime,'2008-01-01 '+ Cast(@HorIni As Char(2)) + ':' + Cast(@MinIni As Char(2)) + ':00.00',121)
   Set @TimeFin = Convert(Datetime,'2008-01-01 '+ Cast(@HorFin As Char(2)) + ':' + Cast(@MinFin As Char(2)) + ':00.00',121)


   Set @HorIni = Round(DateDiff(mi,@TimeIni, @TimeFin) / 60.0,0,1)
   Set @MinIni = DateDiff(mi,@TimeIni, @TimeFin) - (@HorIni*60)  

   RETURN  Case When @HorIni < 10 Then '0' Else '' End + RTrim(Cast(@HorIni As Char(2))) + ':' + 
           Case When @MinIni < 10 Then '0' Else '' End + RTrim(Cast(@MinIni As Char(2))) + ':00'

END


Código SQL [-]
 
  Select  Database.Dbo.CalculaTiempo(10.40,18.55) As Tiempo

ContraVeneno 05-06-2008 22:17:42

amigo poliburro, otra vez estoy con cara de :eek:
interesante procedimiento...

no me termina de cuadrar:
Cita:

Empezado por Gaim2205 (Mensaje 291566)
...un cast que convierta mi entero 10.2 por ejemplo, a 10:20:00 (formato time, sin date) :confused:...

¿desde cuando 10.2 es un entero?

Ten cuidado porque 10.2 no es 10 horas, 20 minutos.
Por ejemplo: 10.5 no son 10 horas, 50 minutos, son 10 horas, 30 minutos.

poliburro 05-06-2008 22:21:23

Cita:

Empezado por ContraVeneno (Mensaje 291624)
amigo poliburro, otra vez estoy con cara de :eek:
interesante procedimiento...

no me termina de cuadrar:


¿desde cuando 10.2 es un entero?

Ten cuidado porque 10.2 no es 10 horas, 20 minutos.
Por ejemplo: 10.5 no son 10 horas, 50 minutos, son 10 horas, 30 minutos.

Tienes razón, pero por la manera en que el compañero hizo el cálculo de tiempo en su primer post imagino que está manejado los enteros para horas y decimales para minutos, por lo tanto el número máximo que tendrá un decimal con su criterio es 59.

:P bueno eso entendí jajaja ya nos lo aclarará el compañero

BlueSteel 05-06-2008 22:38:22

Buena función poliburro...

la dejaré anotada, al menos me sirve gran parte de ella

Salu2:p:D

Gaim2205 05-06-2008 22:48:52

Asi es, poliburro entendió muy bien, con 10.20 me referia a 10 horas 20 minutos... Lo que 10.20 era un entero lo aclare en mi post anterior dedicandome a mi mismo un merecido duuuuuuuuh

y poliburro disculpa pero esto es un poco avanzado para mi.. cualquier combinacion de horas que ingrese a la funcion me da siempre el mismo resultado (06:25:00). Tal vez estoy haciendo algo mal.

si no es mucha molestia me la podrias explicar un poco, como funciona, para asi poder adaptarla yo a mis necesidades. Muchas gracias.

ContraVeneno 05-06-2008 22:58:05

¿cambiaste el 10.40 y el 16.55 o solo hiciste "copiar y pegar"?

Gaim2205 05-06-2008 23:06:24

ok me volvi a explicar mal, quiero decir que con los valores que ingreso poliburro a la funcion 16.55 - 10.40 el resultado seria

6:15 no??.. donde quedaron los otros 10 minutos?
cuando trato con 16.45 - 10.00 me da como resultado 06:75:00

por eso pido de favor, si tienen tiempo explicar un poco la funcion para poder yo adaptarla ya que no me esta dando los resultados deseados, y como tambien dije antes, puede ser que esté haciendo algo mal yo.

Gracias.

poliburro 05-06-2008 23:06:28

Cita:

Empezado por Gaim2205 (Mensaje 291635)
y poliburro disculpa pero esto es un poco avanzado para mi.. cualquier combinacion de horas que ingrese a la funcion me da siempre el mismo resultado (06:25:00). Tal vez estoy haciendo algo mal.

tienes razón, ya corregí la función en el post inicial, vuelve a copiarla y compilarla ya debe funcionar.

Gaim2205 05-06-2008 23:17:49

poliburro podrias leer el post #10 de este hilo, como menciono el problema no era sustituir las horas con los parametros @ValHoraIni o @ValHoraFin, eso si lo hice desde un principio. Pero los resultados aun son un poco extraños, como 16.45 - 10.00 = 06:75:00

espero no ser mucha molestia pero trato de entender los calculos que hiciste y hacer modificaciones pero no he podido llegar a un buen resultado.

poliburro 05-06-2008 23:30:02

Cita:

Empezado por Gaim2205 (Mensaje 291644)
espero no ser mucha molestia pero trato de entender los calculos que hiciste y hacer modificaciones pero no he podido llegar a un buen resultado.

Si checas bien el código actual tiene dos correcciones más :P, por favor vuelve a copiarlo y compilarlo en tu motor y pruebalo nuevamente. A mi me está funcionando bien

Gaim2205 05-06-2008 23:34:58

excelente, muchas gracias a todos.

poliburro 07-06-2008 02:19:31

Cita:

Empezado por Gaim2205 (Mensaje 291648)
excelente, muchas gracias a todos.

Amigo es un gusto ayudar, y si tienes más consultas, psss echalas echalas aca les echamos montón :P


saludos

ContraVeneno 07-06-2008 15:17:48

míralo, míralo, siempre de golosote

:D

poliburro 07-06-2008 18:03:54

Cita:

Empezado por ContraVeneno (Mensaje 292036)
míralo, míralo, siempre de golosote

:D



Bueno bueno, es que el apetito no se apacigua, que le hacemos? jajajaja


La franja horaria es GMT +2. Ahora son las 03:12:50.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi