Tengo una función que toma 4 parámetros, Fecha y Hora inicial ; Fecha y Hora final y me da la diferencia en horas pero en formato decimal, es decir si la diferencia es de 12:30 hrs me trae 12.5 y así sucesivamente. Pero no siempre me trae las diferencias correctas hay algunos casos en que me las trae mal como por ejemplo:
Del '20120712' con hora 1240 osea (12:40) al mismo día '20120712' pero de las 1600 osea (16:00) trae la diferencia mal, pero si la hora final cambia a 1610 (16:10) lo trae correctamente, ¿alguna idea del por qué? les dejo el código para ver si pueden encontrar algún error que yo no.
Muchas gracias de antemano.
Código SQL:
Ver original
CREATE FUNCTION [dbo].[HoraInicialint] ( @HISAP2 nvarchar(10), @HFSAP2 nvarchar(10), @FISAP DateTIME , @FFSAP DATEtime ) RETURNS nvarchar(10) AS BEGIN DECLARE @HIFF VARCHAR (10) DECLARE @HFFF VARCHAR (10) DECLARE @DifDIas nvarchar(10) DECLARE @HP1 nvarchar (10) DECLARE @HP2 nvarchar (10) DECLARE @Salida nVarchar(20) DECLARE @HISAPV VARCHAR (10) DECLARE @HFSAPV VARCHAR (10) DECLARE @HISAP INT DECLARE @HFSAP INT --COnversiond e valores hora a int ---------------------------------------------- SET @HISAPV = CONVERT(FLOAT,@HISAP2 ) SET @HFSAPV = CONVERT(FLOAT,@HFSAP2 ) SET @HISAP = CONVERT(INT,@HISAPV) SET @HFSAP = CONVERT(INT,@HFSAPV) SET @HISAP2 = ISNULL(@HISAP2,01) SET @HFSAP2 = ISNULL(@HFSAP2,01) SET @FISAP = ISNULL(@FISAP,0) SET @FFSAP = ISNULL(@FFSAP,0) -- COnversion de hora inicial IF LEN(@HISAP) = 4 SET @HIFF = CONVERT(Nvarchar,@HISAP) IF LEN(@HISAP) = 1 SET @HIFF = ('000'+ CONVERT(Nvarchar,@HISAP)) IF LEN(@HISAP) = 2 SET @HIFF = ('00'+ CONVERT(Nvarchar,@HISAP)) IF LEN(@HISAP) = 3 SET @HIFF = ('0'+ CONVERT(Nvarchar,@HISAP)) -- COnversion de hora FINAL IF LEN(@HFSAP) = 4 SET @HFFF = CONVERT(Nvarchar,@HFSAP) IF LEN(@HFSAP) = 1 SET @HFFF = ('000'+ CONVERT(Nvarchar,@HFSAP)) IF LEN(@HFSAP) = 2 SET @HFFF = ('00'+ CONVERT(Nvarchar,@HFSAP)) IF LEN(@HFSAP) = 3 SET @HFFF = ('0'+ CONVERT(Nvarchar,@HFSAP)) -- Conversion y calculo de horas ---------------------------------------- IF DATEDIFF(DAY,@FISAP,@FFSAP) >=1 BEGIN SET @DifDIas = ((DATEDIFF(DAY,@FISAP,@FFSAP)*2400) - @HISAP ) + @HFSAP IF LEN(@DifDIas) = 1 SET @DifDIas = ('000'+ CONVERT(Nvarchar,@DifDIas)) IF LEN(@DifDIas) = 2 SET @DifDIas = ('00'+ CONVERT(Nvarchar,@DifDIas)) IF LEN(@DifDIas) = 3 SET @DifDIas = ('0'+ CONVERT(Nvarchar,@DifDIas)) IF LEN(@DifDIas) = 4 SET @DifDIas = CONVERT(Nvarchar,@DifDIas) SET @HP1 = LEFT(@DifDias,2) IF LEN(@DifDIas) = 5 SET @HP1 = LEFT(@DifDias,3) IF (@DifDIas > = 100 ) -- SI es mayor a una hora, se le suma el dia completo BEGIN SET @HP2 = RIGHT(@DifDias,2) IF @HP2 > = 61 BEGIN SET @HP2 = @HP2 -40 SET @Salida = CONVERT(FLOAT,@HP1) + ROUND((CONVERT(FLOAT, @HP2))/60,2 ) END IF @HP2 <= 60 SET @Salida = CONVERT(FLOAT,@HP1) + ROUND((CONVERT(FLOAT, @HP2))/60,2 ) --Set @Salida = @HP2--ROUND((CONVERT(FLOAT, @HP2))/60,2 )--@DifDIas--HP2 END IF (@DifDIas < = 99 )-- si es menor de una hora, no toma en cuenta el dia que paso BEGIN SET @HP2 = RIGHT(@DifDias,2) SET @Salida = ROUND((CONVERT(FLOAT, (@HP2-40)))/60,2 ) END END IF DATEDIFF(DAY,@FISAP,@FFSAP) = 0 --and DATEDIFF(day,@FISAP,@FFSAP) >= 0 BEGIN SET @DifDIas = (CONVERT(FLOAT,@HFSAP) - CONVERT(FLOAT,@HISAP)) IF @DifDIas NOT LIKE '%-%' BEGIN IF LEN(@DifDIas) = 4 SET @DifDIas = CONVERT(Nvarchar,@DifDIas) IF LEN(@DifDIas) = 1 SET @DifDIas = ('000'+ CONVERT(Nvarchar,@DifDIas)) IF LEN(@DifDIas) = 2 SET @DifDIas = ('00'+ CONVERT(Nvarchar,@DifDIas)) IF LEN(@DifDIas) = 3 SET @DifDIas = ('0'+ CONVERT(Nvarchar,@DifDIas)) SET @HP1 = LEFT(@DifDias,2) SET @HP2 = RIGHT(@DifDias,2) IF @HP2 <= 60 SET @Salida = CONVERT(FLOAT,@HP1)+ ROUND((CONVERT(FLOAT, @HP2))/60,2 )-- IF @HP2 >= 61 BEGIN SET @HP2 = @HP2 -40 SET @Salida = CONVERT(FLOAT,@HP1) + ROUND((CONVERT(FLOAT, @HP2))/60,2 ) END END -- endIF @DifDIas NOT LIKE END IF DATEDIFF(DAY,@FISAP,@FFSAP) <=-1 BEGIN SET @DifDIas = ((DATEDIFF(DAY,@FFSAP,@FISAP)*2400) - @HFSAP ) + @HISAP IF LEN(@DifDIas) = 1 SET @DifDIas = ('000'+ CONVERT(Nvarchar,@DifDIas)) IF LEN(@DifDIas) = 2 SET @DifDIas = ('00'+ CONVERT(Nvarchar,@DifDIas)) IF LEN(@DifDIas) = 3 SET @DifDIas = ('0'+ CONVERT(Nvarchar,@DifDIas)) IF LEN(@DifDIas) = 4 SET @DifDIas = CONVERT(Nvarchar,@DifDIas) SET @HP1 = LEFT(@DifDias,2) IF LEN(@DifDIas) = 5 SET @HP1 = LEFT(@DifDias,3) IF LEN(@DifDIas) = 6 SET @HP1 = LEFT(@DifDias,4) IF (@DifDIas > = 100 ) -- SI es mayor a una hora, se le suma el dia completo BEGIN SET @HP2 = RIGHT(@DifDias,2) IF @HP2 > = 61 BEGIN SET @HP2 = @HP2 -40 SET @Salida = (CONVERT(FLOAT,@HP1) + ROUND((CONVERT(FLOAT, @HP2))/60,2 ) )*-1 END IF @HP2 <= 60 SET @Salida = (CONVERT(FLOAT,@HP1) + ROUND((CONVERT(FLOAT, @HP2))/60,2 ) )*-1 --Set @Salida = @HP2--ROUND((CONVERT(FLOAT, @HP2))/60,2 )--@DifDIas--HP2 END IF (@DifDIas < = 99 )-- si es menor de una hora, no toma en cuenta el dia que paso BEGIN SET @HP2 = RIGHT(@DifDias,2) SET @Salida = ( ROUND((CONVERT(FLOAT, (@HP2-40)))/60,2 ))*-1 END END RETURN @Salida END