none
Comparar Horas RRS feed

  • Pregunta

  • Buenas Tardes

    Como se puede hacer para comparar que una hora esta dentro del rango y esta no se inserte a la tabla 

    Ejemplo que el rango de hora de tabla2 20:00 a 23:00 y el rango de la tabla1 06:00 a 23:35 ,

    que no se inserte a la tabla temporal que tengo el horario de la tabla2 ya que el horario de la tabla1 cubre esa hora que es de 06:00 a 23:35 y la tabla2 su horario no entra ya que esta dentro del rango de hora la tabla1

    Saludos 


    Pregunta

    martes, 3 de diciembre de 2019 20:53

Respuestas

  • Hola Dave2203:

    CREATE TABLE tabla1
    (id        INT, 
     typ       INT, 
     subtype   INT, 
     tableName VARCHAR(100), 
     dow       INT, 
     horaIni   VARCHAR(5), 
     horaFin   VARCHAR(5)
    );
    GO
    insert into tabla1 (id, typ, subtype, tableName, dow, horaini, horafin)
    values
    ( 1561, 3, 561, 'Data_M_Bank_02',1,'06:00','23:35'),
    ( 1561, 3, 586, 'Data_M_Bank_02',1,'20:00','23:00'),
    ( 1561, 3, 586, 'Data_M_Bank_02',1,'06:05','23:00');
    GO
    

    Suponiendo que tus columnas de hora sean de tipo varchar o nvarchar, puedes hacer un cast a time, para poder comparar si el valor esta en un rango.

    SELECT tabla1.id
         , tabla1.typ
         , tabla1.subtype
         , tabla1.tableName
         , tabla1.dow
         , tabla1.horaIni
         , tabla1.horaFin
    FROM tabla1 
    WHERE CAST(TABLA1.HORAINI AS TIME(0)) < CAST('20:00' AS TIME(0))
    AND 
    CAST(TABLA1.HORAfIN AS TIME(0)) > CAST('23:00' AS TIME(0))

    Salida

    Para no insertar en alguna tabla, puedes utilizar un if (exists(select ……) o not exists

    • Propuesto como respuesta Diana AcuñaModerator martes, 3 de diciembre de 2019 21:34
    • Marcado como respuesta Dave2203 jueves, 5 de diciembre de 2019 6:05
    martes, 3 de diciembre de 2019 21:18
  • Hola Dave2203:

    CREATE TABLE tabla1
    (id        INT, 
     typ       INT, 
     subtype   INT, 
     tableName VARCHAR(100), 
     dow       INT, 
     horaIni   VARCHAR(5), 
     horaFin   VARCHAR(5)
    );
    GO
    insert into tabla1 (id, typ, subtype, tableName, dow, horaini, horafin)
    values
    ( 1561, 3, 561, 'Data_M_Bank_02',1,'06:00','23:35'),
    ( 1561, 3, 586, 'Data_M_Bank_02',1,'20:00','23:00'),
    ( 1561, 3, 586, 'Data_M_Bank_02',1,'06:05','23:00');
    GO
    CREATE TABLE tabla2
    (id        INT, 
     typ       INT, 
     subtype   INT, 
     tableName VARCHAR(100), 
     dow       INT, 
     horaIni   VARCHAR(5), 
     horaFin   VARCHAR(5)
    );
    GO
    
    
    insert into tabla2 (id, typ, subtype, tableName, dow, horaini, horafin)
    values
    ( 1561, 3, 561, 'Data_M_Bank_02',1,'20:00','23:00');
    GO
    
     if (not exists (
    SELECT tabla1.id
         , tabla1.typ
         , tabla1.subtype
         , tabla1.tableName
         , tabla1.dow
         , tabla1.horaIni
         , tabla1.horaFin
    FROM tabla1 left join tabla2 on tabla1.id = tabla2.id and tabla1.typ = tabla2.typ and tabla1.subtype = tabla2.subtype and tabla1.dow = tabla2.dow 
    WHERE   CAST(TABLA1.HORAINI AS TIME(0)) < CAST(tabla2.horaIni AS TIME(0))
    		AND 
    		CAST(TABLA1.HORAfIN AS TIME(0)) > CAST(tabla2.horaFin AS TIME(0))
    		))
    		BEGIN
    			insert into tabla1
    			select * from tabla2 
    		END
    

    Esto no te insertaría nada.

    Pero si por ejemplo tabla 2 tuviese las 23:55

    delete from tabla2;
    go
    insert into tabla2 (id, typ, subtype, tableName, dow, horaini, horafin)
    values
    ( 1561, 3, 561, 'Data_M_Bank_02',1,'20:00','23:55');
    GO
    
     if (not exists (
    SELECT tabla1.id
         , tabla1.typ
         , tabla1.subtype
         , tabla1.tableName
         , tabla1.dow
         , tabla1.horaIni
         , tabla1.horaFin
    FROM tabla1 left join tabla2 on tabla1.id = tabla2.id and tabla1.typ = tabla2.typ and tabla1.subtype = tabla2.subtype and tabla1.dow = tabla2.dow 
    WHERE   CAST(TABLA1.HORAINI AS TIME(0)) < CAST(tabla2.horaIni AS TIME(0))
    		AND 
    		CAST(TABLA1.HORAfIN AS TIME(0)) > CAST(tabla2.horaFin AS TIME(0))
    		))
    		BEGIN
    			insert into tabla1
    			select * from tabla2 
    		END
    
    

    Salida

    • Marcado como respuesta Dave2203 jueves, 5 de diciembre de 2019 6:05
    martes, 3 de diciembre de 2019 21:36
  • Para comparar el contenido de las tablas, debe utilizar las columnas id, type y Subtype?

    ¿Qué hacer si hay una superposición parcial? Por ejemplo, si la hora de la fila de Tabla2 es 20:00 - 23:50?

    ---

    Además de la sugerencia publicada por Javier, he aquí otra sugerencia, en caso de que haya varias filas en la tabla Tabla2.

    -- código #1 v2
    INSERT into Tabla1 (id, type, Subtype, tableName, Dow, HoraIni, HoraFin)
      SELECT T2.id, T2.type, T2.Subtype, T2.tableName, T2.Dow, T2.HoraIni, T2.HoraFin
        from Tabla2 as T2
        where not exists (SELECT *
                            from Tabla1 as T1
                            where T1.id = T2.id
                                  and T1.type = T2.type
                                  and T1.Subtype = T2.Subtype
                                  and T1.HoraIni <= T2.HoraIni
                                  and T1.HoraFin >= T2.HoraFin);


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz martes, 3 de diciembre de 2019 22:06
    • Marcado como respuesta Dave2203 jueves, 5 de diciembre de 2019 6:05
    martes, 3 de diciembre de 2019 21:55

Todas las respuestas

  • Hola, de que tipo de dato es  HoraIni y HoraFin

    Votar y marcar respuestas es agradecer.
    Saludos.
    Lima-Perú

    martes, 3 de diciembre de 2019 21:04
  • Hola Dave2203:

    CREATE TABLE tabla1
    (id        INT, 
     typ       INT, 
     subtype   INT, 
     tableName VARCHAR(100), 
     dow       INT, 
     horaIni   VARCHAR(5), 
     horaFin   VARCHAR(5)
    );
    GO
    insert into tabla1 (id, typ, subtype, tableName, dow, horaini, horafin)
    values
    ( 1561, 3, 561, 'Data_M_Bank_02',1,'06:00','23:35'),
    ( 1561, 3, 586, 'Data_M_Bank_02',1,'20:00','23:00'),
    ( 1561, 3, 586, 'Data_M_Bank_02',1,'06:05','23:00');
    GO
    

    Suponiendo que tus columnas de hora sean de tipo varchar o nvarchar, puedes hacer un cast a time, para poder comparar si el valor esta en un rango.

    SELECT tabla1.id
         , tabla1.typ
         , tabla1.subtype
         , tabla1.tableName
         , tabla1.dow
         , tabla1.horaIni
         , tabla1.horaFin
    FROM tabla1 
    WHERE CAST(TABLA1.HORAINI AS TIME(0)) < CAST('20:00' AS TIME(0))
    AND 
    CAST(TABLA1.HORAfIN AS TIME(0)) > CAST('23:00' AS TIME(0))

    Salida

    Para no insertar en alguna tabla, puedes utilizar un if (exists(select ……) o not exists

    • Propuesto como respuesta Diana AcuñaModerator martes, 3 de diciembre de 2019 21:34
    • Marcado como respuesta Dave2203 jueves, 5 de diciembre de 2019 6:05
    martes, 3 de diciembre de 2019 21:18
  •  El tipo de dato el time,  como seria la sintaxis de la insercion del IF y el not exists

    Pregunta

    martes, 3 de diciembre de 2019 21:25
  • Hola Dave2203:

    CREATE TABLE tabla1
    (id        INT, 
     typ       INT, 
     subtype   INT, 
     tableName VARCHAR(100), 
     dow       INT, 
     horaIni   VARCHAR(5), 
     horaFin   VARCHAR(5)
    );
    GO
    insert into tabla1 (id, typ, subtype, tableName, dow, horaini, horafin)
    values
    ( 1561, 3, 561, 'Data_M_Bank_02',1,'06:00','23:35'),
    ( 1561, 3, 586, 'Data_M_Bank_02',1,'20:00','23:00'),
    ( 1561, 3, 586, 'Data_M_Bank_02',1,'06:05','23:00');
    GO
    CREATE TABLE tabla2
    (id        INT, 
     typ       INT, 
     subtype   INT, 
     tableName VARCHAR(100), 
     dow       INT, 
     horaIni   VARCHAR(5), 
     horaFin   VARCHAR(5)
    );
    GO
    
    
    insert into tabla2 (id, typ, subtype, tableName, dow, horaini, horafin)
    values
    ( 1561, 3, 561, 'Data_M_Bank_02',1,'20:00','23:00');
    GO
    
     if (not exists (
    SELECT tabla1.id
         , tabla1.typ
         , tabla1.subtype
         , tabla1.tableName
         , tabla1.dow
         , tabla1.horaIni
         , tabla1.horaFin
    FROM tabla1 left join tabla2 on tabla1.id = tabla2.id and tabla1.typ = tabla2.typ and tabla1.subtype = tabla2.subtype and tabla1.dow = tabla2.dow 
    WHERE   CAST(TABLA1.HORAINI AS TIME(0)) < CAST(tabla2.horaIni AS TIME(0))
    		AND 
    		CAST(TABLA1.HORAfIN AS TIME(0)) > CAST(tabla2.horaFin AS TIME(0))
    		))
    		BEGIN
    			insert into tabla1
    			select * from tabla2 
    		END
    

    Esto no te insertaría nada.

    Pero si por ejemplo tabla 2 tuviese las 23:55

    delete from tabla2;
    go
    insert into tabla2 (id, typ, subtype, tableName, dow, horaini, horafin)
    values
    ( 1561, 3, 561, 'Data_M_Bank_02',1,'20:00','23:55');
    GO
    
     if (not exists (
    SELECT tabla1.id
         , tabla1.typ
         , tabla1.subtype
         , tabla1.tableName
         , tabla1.dow
         , tabla1.horaIni
         , tabla1.horaFin
    FROM tabla1 left join tabla2 on tabla1.id = tabla2.id and tabla1.typ = tabla2.typ and tabla1.subtype = tabla2.subtype and tabla1.dow = tabla2.dow 
    WHERE   CAST(TABLA1.HORAINI AS TIME(0)) < CAST(tabla2.horaIni AS TIME(0))
    		AND 
    		CAST(TABLA1.HORAfIN AS TIME(0)) > CAST(tabla2.horaFin AS TIME(0))
    		))
    		BEGIN
    			insert into tabla1
    			select * from tabla2 
    		END
    
    

    Salida

    • Marcado como respuesta Dave2203 jueves, 5 de diciembre de 2019 6:05
    martes, 3 de diciembre de 2019 21:36
  • Para comparar el contenido de las tablas, debe utilizar las columnas id, type y Subtype?

    ¿Qué hacer si hay una superposición parcial? Por ejemplo, si la hora de la fila de Tabla2 es 20:00 - 23:50?

    ---

    Además de la sugerencia publicada por Javier, he aquí otra sugerencia, en caso de que haya varias filas en la tabla Tabla2.

    -- código #1 v2
    INSERT into Tabla1 (id, type, Subtype, tableName, Dow, HoraIni, HoraFin)
      SELECT T2.id, T2.type, T2.Subtype, T2.tableName, T2.Dow, T2.HoraIni, T2.HoraFin
        from Tabla2 as T2
        where not exists (SELECT *
                            from Tabla1 as T1
                            where T1.id = T2.id
                                  and T1.type = T2.type
                                  and T1.Subtype = T2.Subtype
                                  and T1.HoraIni <= T2.HoraIni
                                  and T1.HoraFin >= T2.HoraFin);


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz martes, 3 de diciembre de 2019 22:06
    • Marcado como respuesta Dave2203 jueves, 5 de diciembre de 2019 6:05
    martes, 3 de diciembre de 2019 21:55