Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

RESTAR HORAS, sql server 2008

Estas en el tema de RESTAR HORAS, sql server 2008 en el foro de SQL Server en Foros del Web. hola a todos, quiero dar mi aporte en esta ocasion, ante la imposibilidad de restar horas(como asi tambien sumar) en una consulta sql de forma ...
  #1 (permalink)  
Antiguo 09/12/2009, 14:46
Avatar de gabrielflowers  
Fecha de Ingreso: julio-2007
Ubicación: Santa Cruz de la Sierra
Mensajes: 187
Antigüedad: 16 años, 9 meses
Puntos: 3
RESTAR HORAS, sql server 2008

hola a todos, quiero dar mi aporte en esta ocasion, ante la imposibilidad de restar horas(como asi tambien sumar) en una consulta sql de forma directa, me vi obligado a crearme una funcion en el motor de sql, dicha funcion expongo a continuacion:

Código:
USE [MiBD]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[DIFFTIME](@HoraFin as time,@HoraInicio as time)
RETURNS time AS
BEGIN
	--esta funcion obtiene la diferencia de horas: HoraFin-HoraInicio, y devuelve el resultado en formato tiempo,siempre devuelve el resultado positivo
	DECLARE
	@sols int,@tsolucion time
	
	SET @sols=DATEDIFF(SECOND,@HoraInicio,@HoraFin)--diferencia en segundos
	SET @tsolucion=convert(time,dateadd(SECOND,@sols,0))
	RETURN @tsolucion 
END
y pueden probar la funcion con una simple consulta:

Código:
select [dbo].[DIFFTIME]('9:00','8:45:00')
--devuelve 00:15:00.0000000
--explicacion 9:00-8:45 = 00:15:00.0000000
la funcion esta bien y funciona, solo le pille un incoveniente, cuando resto horas y el resultado me sale negativo, pues mi funcion no me devuelve nunca un resultado negativo, ya q el tipo time puede tener un valor minimo de 00:00:00.0000000 , en estos casos particulares q mi funcion debiera devolver un negativo, mi funcion devuelve un valor positivo equivalente

ejm: 8:00-9:00= 23:00 (el resultado debio ser -01:00,pero al no haber negativos en el tipo time, hace la resta al valor maximo del tipo time es decir 24:00... )

habra q tomar las consideraciones del caso, saludos
__________________
"puedo detenerme, pero no retroceder, tengo que avanzar..."
  #2 (permalink)  
Antiguo 11/12/2009, 14:36
Avatar de gabrielflowers  
Fecha de Ingreso: julio-2007
Ubicación: Santa Cruz de la Sierra
Mensajes: 187
Antigüedad: 16 años, 9 meses
Puntos: 3
Respuesta: RESTAR HORAS, sql server 2008

Mejorando esta funcion, obtuve otra que solo me devuelve el resultado correspondiente pero sin signo, habra q determinar cual de los operandos es mayor para determinar el signo y ya esta......

aca expongo mi funcion mejorada para restar horas en formato tiempo:

Código:
USE [mibd]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[DIFFTIME](@HoraFin as time,@HoraInicio as time)
RETURNS time AS
BEGIN
	DECLARE
	@sols int,@tsolucion time
	
	SET @sols=DATEDIFF(SECOND,@HoraInicio,@HoraFin)--diferencia en seg
	IF(@sols<0) SET @sols=ABS(@sols)
	SET @tsolucion=convert(time,dateadd(SECOND,@sols,0))
	RETURN @tsolucion 
END

espero les sea de utilidad
__________________
"puedo detenerme, pero no retroceder, tengo que avanzar..."
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:15.