none
Insertar validando rango de hora SQL RRS feed

  • Pregunta

  • Hola ,Tengo la siguiente tabla.

    al momento de insertar un registro mas con mi procedure mando los dos siguientes parámetros:

    @horainicio:'08:40'

    @horafin:'09:40'

    Como se puede hacer la validación para que no inserte si los rango de los parámetros de entrada se cruzan con alguno que ya está registrado previamente en la tabla.

    lunes, 21 de mayo de 2018 17:10

Todas las respuestas

  • hola RODRIGOMEJIA:

    Existen muchos modos, aunque como no has puesto la tabla, me he supuesto que codigo es un numero identity.

    CREATE TABLE HORAS
    (CODIGO     INT IDENTITY(1, 1),
     HORAINICIO TIME,
     HORAFIN    TIME
    );
    GO
    INSERT INTO HORAS
    (HORAINICIO,
     HORAFIN
    )
    VALUES
    ('08:00:00',
     '08:30:00'
    ),
    ('08:30:00',
     '09:00:00'
    ),
    ('09:00:00',
     '09:30:00'
    ),
    ('09:30:00',
     '10:00:00'
    );
    GO
    CREATE PROCEDURE INSERTAHORAS
    (@HORAINICIO TIME,
     @HORAFIN    TIME
    )
    AS
         IF(
    (
        SELECT COUNT(*)
        FROM HORAS  
    
    /*TAMBIEN SE PUEDE UTILIZAR EXISTS*/
    
        WHERE HORAINICIO = @HORAINICIO
              AND HORAFIN = @HORAFIN
    ) = 0)
             BEGIN
                 INSERT INTO HORAS
    (HORAINICIO,
     HORAFIN
    )
                 VALUES
    (@HORAINICIO,
     @HORAFIN
    );
             END;
    GO
    EXEC INSERTAHORAS
         '10:00:00',
         '10:30:00';
    EXEC INSERTAHORAS
         '10:00:00',
         '10:30:00';
    SELECT *
    FROM HORAS;
    
    
    

    Esta es una posible solución.

    Un saludo

    lunes, 21 de mayo de 2018 18:22
  • Hola !,

    Eso sería en el caso que hay un registro con los mismos parámetros de entrada.

    pero que pasaría si necesariamente no sean iguales los parámetros de entrada pero si estén entre algunos registros 

    ejemplo:

    horaInicio:'08:40'

    horaTermino:'09:40'

    no existe un registro con esa hora.

    pero si se cruzaría con el registro de código 2 y 3 ya el rango entrante comprende una parte de esos 2 registros

    lunes, 21 de mayo de 2018 18:42
  • Hola Rodrigo:

    Por ejemplo

      SELECT COUNT(*)
        FROM HORAS  
    
       WHERE HORAINICIO between @HORAINICIO and @HORAFIN 
    	or HORAFIN BETWEEN @HORAINICIO AND @HORAFIN

    Dado que los campos son TIME, puedes hacer un between.

    Si existe algun registro entre las horas parametrizadas, bien sea en hora inicio o en hora fin, entonces no insertas

    Un saludo


    lunes, 21 de mayo de 2018 18:46