none
Restar fechas y convertir resultado en horas y minutos sql server 2008 RRS feed

  • Pregunta

  • Buen día tengo la siguiente consulta que resta la fecha actual menos otra fecha pero el resultado cuando debe ser positivo lo pone negativo y viceversa. 

    Hay alguna otra manera de poder obtener las horas y minutos de uan resta de fechas?


    SELECT CONVERT(VARCHAR(20),DATEDIFF(mi,'2021-04-18 04:36:00',GETDATE())/60) + ':' + CONVERT(VARCHAR(20),DATEDIFF(mi,'2021-04-17 04:37:00',GETDATE())%60)


    viernes, 16 de abril de 2021 19:34

Respuestas

  • Que hay amigo, hace tiempo yo realicé la misma consulta :) ignoro si te servirá a ti tmb, pero te dejo mi solución que tuve en ese momento, este es el tema donde pregunté:

    Duda al restar 2 Fechas yendo al problema, te comento lo que me sugirieron:

    Primero creamos una función en la cuál nos va a ayudar con esta cuestión la resta de las fechas (esto si quieres trabajar con variables de una tabla) de lo contrario con solo declarar valores a dichas variables de la función con eso queda:

     create Function dbo.difentrehoras 
    ( 
    @DateInit datetime,
    @DateEnd datetime
    )
    returns varchar(100)
    BEGIN
    return
    (
    	Select		
    			CONVERT(VARCHAR(12), datediff(SECOND,@DateInit,@DateEnd) / 60 / 60 / 24) 
    + ' día(s): ' + CONVERT(VARCHAR(12), datediff(SECOND,@DateInit,@DateEnd) / 60 / 60 % 24) 
    + ' hora(s): ' + CONVERT(VARCHAR(2), datediff(SECOND,@DateInit,@DateEnd) / 60 % 60) 
    + ' minuto(s): ' + CONVERT(VARCHAR(2), datediff(SECOND,@DateInit,@DateEnd) % 60) + ' segundo(s)' AS Dif
    );
    END

    Si solo quieres que sean Horas y Minutos elimina esta parte después del SELECT en la función:

    CONVERT(VARCHAR(12), datediff(SECOND,@DateInit,@DateEnd) / 60 / 60 / 24) 
    + ' día(s): ' + 

    Quedando así:

    create Function dbo.difentrehoras
    ( 
    @DateInit datetime,
    @DateEnd datetime
    )
    returns varchar(100)
    BEGIN
    return
    (
    	Select		
    			CONVERT(VARCHAR(12), datediff(SECOND,@DateInit,@DateEnd) / 60 / 60 % 24) 
    + ' hora(s): ' + CONVERT(VARCHAR(2), datediff(SECOND,@DateInit,@DateEnd) / 60 % 60) 
    + ' minuto(s): ' + CONVERT(VARCHAR(2), datediff(SECOND,@DateInit,@DateEnd) % 60) + ' segundo(s)' AS Dif
    );
    END

    Ahora realizamos el código, te dejaré un ejemplo del cómo quedó en el mío:

    Select 
    		d.FECHA_INICIO,d.FECHA_FIN,
    		dbo.difentrehoras (FECHA_INICIO, FECHA_FIN) as 'Diferencia' 
        FROM dbo.TABLE d

    Y te arrojará el resultado de la siguiente forma:

    ALTA	                    ULTIMAACTUALIZACION	             Diferencia
    2021-04-14 06:18:47.000	   2021-04-14 08:11:35.000	     1 hora(s): 52 minuto(s): 48 segundo(s)

    Espero que te sirva.

    Saludos.

    Edito:

    Poniendo como los datos que dejas en el ejemplo, sería algo así:

     DECLARE @DateInit datetime = '2021-04-17T04:37:00';
     DECLARE @DateEnd datetime = '2021-04-18T04:36:00';
    	Select		
    			CONVERT(VARCHAR(12), datediff(SECOND,@DateInit,@DateEnd) / 60 / 60 % 24) 
    + ' hora(s): ' + CONVERT(VARCHAR(2), datediff(SECOND,@DateInit,@DateEnd) / 60 % 60) 
    + ' minuto(s): ' + CONVERT(VARCHAR(2), datediff(SECOND,@DateInit,@DateEnd) % 60) + ' segundo(s)' AS Diferencia
    

    Teniendo como resultado:

    Diferencia
    23 hora(s): 59 minuto(s): 0 segundo(s)
    • Editado Alejandro 0991 viernes, 16 de abril de 2021 21:19
    • Propuesto como respuesta Javi Fernández F domingo, 18 de abril de 2021 5:53
    • Marcado como respuesta Emma Grz viernes, 13 de agosto de 2021 19:56
    viernes, 16 de abril de 2021 20:07