Ver Mensaje Individual
  #1 (permalink)  
Antiguo 15/08/2012, 16:10
Gaug
 
Fecha de Ingreso: junio-2009
Mensajes: 250
Antigüedad: 15 años, 6 meses
Puntos: 1
Diferencia de fechas y horas

Hola que tal,

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
  1. CREATE FUNCTION [dbo].[HoraInicialint]
  2.  
  3. (   @HISAP2 nvarchar(10),
  4.     @HFSAP2 nvarchar(10),
  5.     @FISAP DateTIME ,
  6.     @FFSAP DATEtime
  7.      )
  8.  
  9. RETURNS nvarchar(10)
  10. AS
  11. BEGIN
  12. DECLARE @HIFF VARCHAR (10)
  13. DECLARE @HFFF VARCHAR (10)
  14. DECLARE @DifDIas nvarchar(10)
  15. DECLARE @HP1 nvarchar (10)
  16. DECLARE @HP2 nvarchar (10)
  17. DECLARE @Salida nVarchar(20)
  18. DECLARE @HISAPV VARCHAR (10)
  19. DECLARE @HFSAPV VARCHAR (10)
  20. DECLARE @HISAP INT
  21. DECLARE @HFSAP INT
  22.  
  23.  
  24.     --COnversiond e valores hora  a int ----------------------------------------------
  25.     SET @HISAPV = CONVERT(FLOAT,@HISAP2 )
  26.     SET @HFSAPV = CONVERT(FLOAT,@HFSAP2 )
  27.     SET @HISAP = CONVERT(INT,@HISAPV)
  28.     SET @HFSAP = CONVERT(INT,@HFSAPV)
  29.    
  30.     SET @HISAP2 = ISNULL(@HISAP2,01)
  31.     SET @HFSAP2 = ISNULL(@HFSAP2,01)
  32.     SET @FISAP = ISNULL(@FISAP,0)
  33.     SET @FFSAP = ISNULL(@FFSAP,0)
  34.    
  35.    
  36.    
  37.     -- COnversion de hora inicial
  38.     IF LEN(@HISAP) = 4
  39.     SET @HIFF =  CONVERT(Nvarchar,@HISAP)
  40.  
  41.     IF LEN(@HISAP) = 1
  42.     SET @HIFF = ('000'+ CONVERT(Nvarchar,@HISAP))
  43.  
  44.     IF LEN(@HISAP) = 2
  45.     SET @HIFF = ('00'+ CONVERT(Nvarchar,@HISAP))
  46.  
  47.     IF LEN(@HISAP) = 3
  48.     SET @HIFF = ('0'+ CONVERT(Nvarchar,@HISAP))
  49.  
  50.     -- COnversion de hora FINAL
  51.     IF LEN(@HFSAP) = 4
  52.     SET @HFFF =  CONVERT(Nvarchar,@HFSAP)
  53.  
  54.     IF LEN(@HFSAP) = 1
  55.     SET @HFFF = ('000'+ CONVERT(Nvarchar,@HFSAP))
  56.  
  57.     IF LEN(@HFSAP) = 2
  58.     SET @HFFF = ('00'+ CONVERT(Nvarchar,@HFSAP))
  59.  
  60.     IF LEN(@HFSAP) = 3
  61.     SET @HFFF = ('0'+ CONVERT(Nvarchar,@HFSAP))
  62.    
  63.    
  64.     -- Conversion y calculo de horas ----------------------------------------
  65.    
  66.    
  67.     IF DATEDIFF(DAY,@FISAP,@FFSAP) >=1
  68.     BEGIN
  69.         SET @DifDIas = ((DATEDIFF(DAY,@FISAP,@FFSAP)*2400) - @HISAP )  + @HFSAP  
  70.             IF LEN(@DifDIas) = 1
  71.                 SET @DifDIas = ('000'+ CONVERT(Nvarchar,@DifDIas))
  72.             IF LEN(@DifDIas) = 2
  73.                 SET @DifDIas = ('00'+ CONVERT(Nvarchar,@DifDIas))
  74.             IF LEN(@DifDIas) = 3
  75.                 SET @DifDIas = ('0'+ CONVERT(Nvarchar,@DifDIas))           
  76.             IF LEN(@DifDIas) = 4                                           
  77.                 SET @DifDIas =  CONVERT(Nvarchar,@DifDIas)                 
  78.                 SET @HP1 = LEFT(@DifDias,2)
  79.             IF LEN(@DifDIas) = 5
  80.                 SET @HP1 = LEFT(@DifDias,3)
  81.             IF (@DifDIas > = 100 ) -- SI es mayor a una hora, se le suma el dia completo
  82.                 BEGIN
  83.                     SET @HP2 = RIGHT(@DifDias,2)
  84.                     IF @HP2 > = 61
  85.                     BEGIN
  86.                         SET @HP2 = @HP2 -40
  87.                         SET @Salida =   CONVERT(FLOAT,@HP1) + ROUND((CONVERT(FLOAT, @HP2))/60,2 )
  88.                     END
  89.                     IF @HP2 <= 60
  90.                         SET @Salida =   CONVERT(FLOAT,@HP1) + ROUND((CONVERT(FLOAT, @HP2))/60,2 )
  91.                         --Set @Salida =  @HP2--ROUND((CONVERT(FLOAT, @HP2))/60,2 )--@DifDIas--HP2
  92.                 END
  93.             IF (@DifDIas < = 99 )-- si es menor de una hora, no toma en cuenta el dia que paso
  94.                 BEGIN
  95.                     SET @HP2 = RIGHT(@DifDias,2)
  96.                     SET @Salida =  ROUND((CONVERT(FLOAT, (@HP2-40)))/60,2 )
  97.                 END
  98.                
  99.     END
  100.     IF  DATEDIFF(DAY,@FISAP,@FFSAP) = 0 --and  DATEDIFF(day,@FISAP,@FFSAP) >= 0
  101.     BEGIN
  102.         SET @DifDIas = (CONVERT(FLOAT,@HFSAP) - CONVERT(FLOAT,@HISAP))
  103.         IF @DifDIas NOT LIKE '%-%'
  104.             BEGIN
  105.                 IF LEN(@DifDIas) = 4
  106.                     SET @DifDIas =  CONVERT(Nvarchar,@DifDIas)
  107.                 IF LEN(@DifDIas) = 1
  108.                     SET @DifDIas = ('000'+ CONVERT(Nvarchar,@DifDIas))
  109.                 IF LEN(@DifDIas) = 2
  110.                     SET @DifDIas = ('00'+ CONVERT(Nvarchar,@DifDIas))
  111.                 IF LEN(@DifDIas) = 3
  112.                     SET @DifDIas = ('0'+ CONVERT(Nvarchar,@DifDIas))
  113.             SET @HP1 = LEFT(@DifDias,2)
  114.             SET @HP2 = RIGHT(@DifDias,2)
  115.             IF @HP2 <= 60
  116.                 SET @Salida =  CONVERT(FLOAT,@HP1)+ ROUND((CONVERT(FLOAT, @HP2))/60,2 )--
  117.             IF @HP2 >= 61
  118.                 BEGIN
  119.                     SET @HP2 = @HP2 -40
  120.                     SET @Salida = CONVERT(FLOAT,@HP1) + ROUND((CONVERT(FLOAT, @HP2))/60,2 )
  121.                 END
  122.             END -- endIF @DifDIas NOT LIKE
  123.     END
  124.    
  125.    
  126.    
  127.     IF DATEDIFF(DAY,@FISAP,@FFSAP) <=-1
  128.     BEGIN
  129.         SET @DifDIas = ((DATEDIFF(DAY,@FFSAP,@FISAP)*2400) -  @HFSAP )  +   @HISAP
  130.             IF LEN(@DifDIas) = 1
  131.                 SET @DifDIas = ('000'+ CONVERT(Nvarchar,@DifDIas))
  132.             IF LEN(@DifDIas) = 2
  133.                 SET @DifDIas = ('00'+ CONVERT(Nvarchar,@DifDIas))
  134.             IF LEN(@DifDIas) = 3
  135.                 SET @DifDIas = ('0'+ CONVERT(Nvarchar,@DifDIas))           
  136.             IF LEN(@DifDIas) = 4                                           
  137.                 SET @DifDIas =  CONVERT(Nvarchar,@DifDIas)                 
  138.                 SET @HP1 = LEFT(@DifDias,2)
  139.             IF LEN(@DifDIas) = 5
  140.                 SET @HP1 = LEFT(@DifDias,3)
  141.             IF LEN(@DifDIas) = 6
  142.                 SET @HP1 = LEFT(@DifDias,4)
  143.             IF (@DifDIas > = 100 ) -- SI es mayor a una hora, se le suma el dia completo
  144.                 BEGIN
  145.                     SET @HP2 = RIGHT(@DifDias,2)
  146.                     IF @HP2 > = 61
  147.                     BEGIN
  148.                         SET @HP2 = @HP2 -40
  149.                         SET @Salida =   (CONVERT(FLOAT,@HP1) + ROUND((CONVERT(FLOAT, @HP2))/60,2 ) )*-1
  150.                     END
  151.                     IF @HP2 <= 60
  152.                         SET @Salida =   (CONVERT(FLOAT,@HP1) + ROUND((CONVERT(FLOAT, @HP2))/60,2 ) )*-1
  153.                         --Set @Salida =  @HP2--ROUND((CONVERT(FLOAT, @HP2))/60,2 )--@DifDIas--HP2
  154.                 END
  155.             IF (@DifDIas < = 99 )-- si es menor de una hora, no toma en cuenta el dia que paso
  156.                 BEGIN
  157.                     SET @HP2 = RIGHT(@DifDias,2)
  158.                     SET @Salida = ( ROUND((CONVERT(FLOAT, (@HP2-40)))/60,2 ))*-1
  159.                 END
  160.                
  161.     END
  162. RETURN @Salida
  163.  END