none
diferencia en horas con campos varchar RRS feed

  • Pregunta

  • Buen dia cual seria la consulta para   obtener el total de horas de diferencia  entre dos columnas que son de tipo varchar lo que pasa que pretendo emplearlo posteriormente   a nivel programacion para que me bloquee la funcion si la hora de diferencia entre esas columnas son de x horas ejemplo 2 horas, en este ejemplo no deberia por ejemplo permitirme lanzar la funcion

    noabrirturno           abrirturno
    04:00:00 AM          06:00:00 AM

    miércoles, 28 de noviembre de 2018 22:33

Respuestas

  • Hola juanki724:

    Tienes que intentar pensar en conjuntos y no en funciones individuales para realizar una acción.

    Te traslado un ejemplo que te puede ayudar, puesto que si tu esperas retornar un listado de algo que encaje en lo que solicites, solo tienes que decirle al sql que evalue en el where lo que no encaje. Puedes utilizar otras técnicas, tipo Cross Apply. Ahí te va el ejemplo

    declare  @campos table (noabrirturno  varchar(100), abrirturno varchar(100))
    insert into @campos (noabrirturno, abrirturno)
    values
    ('04:00:00 AM','06:00:00 AM'),
    ('04:00:00 PM','06:00:00 PM'),
    ('04:00:00 AM','06:01:00 AM'),
    ('04:00:00 PM','06:01:00 PM')
    DECLARE @DIF INT= 2;
    SET @dif = @DIF * 60 * 60 * 1000; 
    
    /*convertimos las horas a milisegundos*/
    
    SELECT CONVERT(TIME, noabrirturno, 108),
           CONVERT(TIME, abrirturno, 108),
           CONVERT(DATETIME, noabrirturno, 109),
           CONVERT(DATETIME, abrirturno, 109),
           DATEDIFF(MILLISECOND, CONVERT(TIME, noabrirturno, 108), CONVERT(TIME, abrirturno, 108))
    FROM @campos
    WHERE DATEDIFF(MILLISECOND, CONVERT(TIME, noabrirturno, 108), CONVERT(TIME, abrirturno, 108)) > @DIF;
    
    

    Salida:

    Cast y Convert

    https://docs.microsoft.com/es-es/sql/t-sql/functions/cast-and-convert-transact-sql?view=sql-server-2017

    DateDiffhttps://docs.microsoft.com/es-es/sql/t-sql/functions/datediff-transact-sql?view=sql-server-2017

    Espero te ayude.

    • Marcado como respuesta juanki724 jueves, 29 de noviembre de 2018 22:00
    jueves, 29 de noviembre de 2018 6:46

Todas las respuestas

  • Hola que tal.

    Tal vez te pueda servir esta conversión

    SELECT convert(datetime,'04:00:00', 114) -- hh:mm:ss:mmm(24h)

    SELECT  convert(datetime,'04:00:00', 108)-- hh:mm:ss

    miércoles, 28 de noviembre de 2018 23:10
  • Hola juanki724:

    Tienes que intentar pensar en conjuntos y no en funciones individuales para realizar una acción.

    Te traslado un ejemplo que te puede ayudar, puesto que si tu esperas retornar un listado de algo que encaje en lo que solicites, solo tienes que decirle al sql que evalue en el where lo que no encaje. Puedes utilizar otras técnicas, tipo Cross Apply. Ahí te va el ejemplo

    declare  @campos table (noabrirturno  varchar(100), abrirturno varchar(100))
    insert into @campos (noabrirturno, abrirturno)
    values
    ('04:00:00 AM','06:00:00 AM'),
    ('04:00:00 PM','06:00:00 PM'),
    ('04:00:00 AM','06:01:00 AM'),
    ('04:00:00 PM','06:01:00 PM')
    DECLARE @DIF INT= 2;
    SET @dif = @DIF * 60 * 60 * 1000; 
    
    /*convertimos las horas a milisegundos*/
    
    SELECT CONVERT(TIME, noabrirturno, 108),
           CONVERT(TIME, abrirturno, 108),
           CONVERT(DATETIME, noabrirturno, 109),
           CONVERT(DATETIME, abrirturno, 109),
           DATEDIFF(MILLISECOND, CONVERT(TIME, noabrirturno, 108), CONVERT(TIME, abrirturno, 108))
    FROM @campos
    WHERE DATEDIFF(MILLISECOND, CONVERT(TIME, noabrirturno, 108), CONVERT(TIME, abrirturno, 108)) > @DIF;
    
    

    Salida:

    Cast y Convert

    https://docs.microsoft.com/es-es/sql/t-sql/functions/cast-and-convert-transact-sql?view=sql-server-2017

    DateDiffhttps://docs.microsoft.com/es-es/sql/t-sql/functions/datediff-transact-sql?view=sql-server-2017

    Espero te ayude.

    • Marcado como respuesta juanki724 jueves, 29 de noviembre de 2018 22:00
    jueves, 29 de noviembre de 2018 6:46