none
Duda al restar 2 Fechas RRS feed

  • Pregunta

  • Buenas tardes.

    Nuevamente vengo a solicitar de su apoyo y ayuda compañeros. Me explico:

    Anteriormente ya había consultado sobre esta cuestión de restar 2 fechas de 2 campos; "lo había resuelto" pero me acabo de revisar (después de un largo tiempo) y veo que no quedó bien.

    Tengo el siguiente código:

    SELECT d.OT, d.ALTA,d.ULTIMAACTUALIZACION, d.EQUIPO, d.TITULO
            FROM 
        dbo.M_OT d
    WHERE CAST(D.ALTA AS DATE) between '2020-12-01' and GETDATE()  AND d.EQUIPO='ALP-01'
     ORDER BY D.EQUIPO ASC

    En el cual tengo el siguiente resultado:

    OT	ALTA	                   ULTIMAACTUALIZACION	        EQUIPO	   TITULO
    3957	2020-12-11 17:07:46.000	   2020-12-22 17:23:32.000	ALP-01	   ALPINE 1
    3999	2020-12-15 23:07:14.000	   2020-12-22 17:23:31.000	ALP-01	   ALPINE 1
    4017	2020-12-16 22:26:53.000	   2020-12-22 17:24:51.000	ALP-01	   ALPINE 1
    4083	2020-12-23 06:07:58.000	   2020-12-23 09:29:32.000	ALP-01	   ALPINE 1

    Lo que intento saber es tiempo muerto (diferencia entre las fechas de ULTIMAACTUALIZACION y ALTA), donde al hacer una resta directa entre ambas fechas (ejemplo de la OT 3957) me da el siguiente resultado:

    select (ULTIMAACTUALIZACION-ALTA) as 'Tiempo Muerto' from M_OT where ot=3957
    
    Tiempo Muerto
    1900-01-12 00:15:46.000

    En la que me dice por ende 12 días 00 horas: 15 minutos: 46 segundos (sin contar el resultado de año y mes).

    Ya había buscado una forma de obtener este resultado como lo menciono anteriormente, pero no logré toparme con nada :/ (al menos en cuestión de trabajar con fechas aún estoy muy nuevo y honestamente me cuesta un poco de trabajo).

    Me habían pasado anteriormente una liga donde estaba un ejemplo algo así:

     DECLARE @Seconds int = 86200;
    SELECT CONVERT(VARCHAR(12), @Seconds / 60 / 60 / 24) 
    + ':' + CONVERT(VARCHAR(12), @Seconds / 60 / 60 % 24) 
    + ':' + CONVERT(VARCHAR(2), @Seconds / 60 % 60) 
    + ':' + CONVERT(VARCHAR(2), @Seconds % 60) AS ' Day(s) : Hour(s) : Minute(s) : Second(s) '

    Pero honestamente, no encontré cómo utilizar mis variables en ese ejemplo :/

    Lo que estoy intentando saber son 2 cuestiones:

    1. El tiempo muerto (diferencia entre 2 fechas) por partida
    2. Y el total del tiempo muerto (suma total de las partidas)}

    Haciendo el ejercicio en Excel (para saber los resultados) sería algo así:

    ULTIMAACTUALIZACION ALTA Tiempo Muerto 2020/12/22 05:23:32 p. m. 2020/12/11 05:07:46 p. m. 11 días 00 horas: 15 minutos: 46 segundos 2020/12/22 05:23:31 p. m. 2020/12/15 11:07:14 p. m. 06 días 18 horas: 16 minutos: 17 segundos 2020/12/22 05:24:51 p. m. 2020/12/16 10:26:53 p. m. 05 días 18 horas: 57 minutos: 58 segundos 2020/12/23 09:29:32 a. m. 2020/12/23 06:07:58 a. m. 00 días 03 horas: 21 minutos: 34 segundos

    Tiempo Muerto Total 23 días 16 horas: 51 minutos: 35 segundos

    Honestamente le he batallado inmensamente en estas cuestiones, no se si me puedan apoyar o guiarme para entender un poco más el cómo poder trabajar con fechas :(

    De antemano muchas gracias por su tiempo y paciencia.

    Saludos.


    • Editado Alejandro 0991 miércoles, 30 de diciembre de 2020 23:41 Corregir detalles
    miércoles, 30 de diciembre de 2020 23:37

Respuestas

  • Hola Alejandro0991:

    Create Table dbo.M_OT (OT int, Alta datetime, UltimaActualizacion datetime, Equipo varchar(6), Titulo varchar(20))
    Go
    Set dateFormat ymd;
    Insert into dbo.M_OT(OT, Alta, UltimaActualizacion, Equipo, Titulo)
    values
    (3957,'2020-12-11 17:07:46.000','2020-12-22 17:23:32.000','ALP-01','ALPINE 1'),
    (3999,'2020-12-15 23:07:14.000','2020-12-22 17:23:31.000','ALP-01','ALPINE 1'),
    (4017,'2020-12-16 22:26:53.000','2020-12-22 17:24:51.000','ALP-01','ALPINE 1'),
    (4083,'2020-12-23 06:07:58.000','2020-12-23 09:29:32.000','ALP-01','ALPINE 1');
    Go

    Con el escenario, y aplicando "tu liga", realmente lo que espera es la diferencia de segundos entre las fechas.

    Hay que sustituir esa variable por la función dateDiff para que SQL nos calcule la diferencia en segundos.

    Select 
    		CONVERT(VARCHAR(12), datediff(SECOND,Alta,UltimaActualizacion) / 60 / 60 / 24) 
    + ':' + CONVERT(VARCHAR(12), datediff(SECOND,Alta,UltimaActualizacion) / 60 / 60 % 24) 
    + ':' + CONVERT(VARCHAR(2), datediff(SECOND,Alta,UltimaActualizacion) / 60 % 60) 
    + ':' + CONVERT(VARCHAR(2), datediff(SECOND,Alta,UltimaActualizacion) % 60) AS ' Day(s) : Hour(s) : Minute(s) : Second(s) '
    	
    	From dbo.M_OT;


    DateDiff te devuelve la diferencia en las partes que quieras, entre dos fechas. En el caso la diferencia en segundos.

    Luego cuando lo tengas claro, puedes reconvertir ese código en una función escalar.

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

    y la aplicas, quedando el código más claro y simple.

    Select 
    		dbo.dateTimeDifInDaysHoursMinuteAndSecond (Alta, UltimaActualizacion) as [diferencia]
    	From dbo.M_OT


    Si también quieres el total en la misma fila, una posible solución puede ser.

    ;with cte as (
    
    Select dbo.datetimedifindayshoursminuteandsecond
    	   ( alta, ultimaactualizacion ) As diferencia
    	 , alta
    	 , ultimaactualizacion
    	 , DateDiff(second, alta, ultimaactualizacion) As difsec
    	   From dbo.m_ot;
    ), total as (
    select sum(difSec) as total from cte 
    )
    Select cte.*,		
    			CONVERT(VARCHAR(12),tOTAL.TOTAL / 60 / 60 / 24) 
    	+ ':' + CONVERT(VARCHAR(12),tOTAL.TOTAL / 60 / 60 % 24) 
    	+ ':' + CONVERT(VARCHAR(2), tOTAL.TOTAL / 60 % 60) 
    	+ ':' + CONVERT(VARCHAR(2), tOTAL.TOTAL % 60) AS Dif 
    	from cte cross join total 

    Utilizar un cte correlativo. En el primer conjunto extraes los datos que necesitas de la tabla y calculas la diferencia en segundos para obtener el total de la partida.

    En el segundo cte calculas el total.

    En la salida obtienes los datos a visualizar del cte y le haces un cross join al total, para tenerlo en todas las filas.

    DateDiff

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

    Funciones de fecha útiles

    https://javifer2.wordpress.com/2019/12/15/funciones-de-fecha-para-datetime-utiles/

    Cte correlativo

    https://javifer2.wordpress.com/2018/12/18/with-cte-tablas-de-expresion-comun-2-correlativos/

    • Marcado como respuesta Alejandro 0991 jueves, 31 de diciembre de 2020 14:19
    jueves, 31 de diciembre de 2020 5:52

Todas las respuestas

  • Hola Alejandro0991:

    Create Table dbo.M_OT (OT int, Alta datetime, UltimaActualizacion datetime, Equipo varchar(6), Titulo varchar(20))
    Go
    Set dateFormat ymd;
    Insert into dbo.M_OT(OT, Alta, UltimaActualizacion, Equipo, Titulo)
    values
    (3957,'2020-12-11 17:07:46.000','2020-12-22 17:23:32.000','ALP-01','ALPINE 1'),
    (3999,'2020-12-15 23:07:14.000','2020-12-22 17:23:31.000','ALP-01','ALPINE 1'),
    (4017,'2020-12-16 22:26:53.000','2020-12-22 17:24:51.000','ALP-01','ALPINE 1'),
    (4083,'2020-12-23 06:07:58.000','2020-12-23 09:29:32.000','ALP-01','ALPINE 1');
    Go

    Con el escenario, y aplicando "tu liga", realmente lo que espera es la diferencia de segundos entre las fechas.

    Hay que sustituir esa variable por la función dateDiff para que SQL nos calcule la diferencia en segundos.

    Select 
    		CONVERT(VARCHAR(12), datediff(SECOND,Alta,UltimaActualizacion) / 60 / 60 / 24) 
    + ':' + CONVERT(VARCHAR(12), datediff(SECOND,Alta,UltimaActualizacion) / 60 / 60 % 24) 
    + ':' + CONVERT(VARCHAR(2), datediff(SECOND,Alta,UltimaActualizacion) / 60 % 60) 
    + ':' + CONVERT(VARCHAR(2), datediff(SECOND,Alta,UltimaActualizacion) % 60) AS ' Day(s) : Hour(s) : Minute(s) : Second(s) '
    	
    	From dbo.M_OT;


    DateDiff te devuelve la diferencia en las partes que quieras, entre dos fechas. En el caso la diferencia en segundos.

    Luego cuando lo tengas claro, puedes reconvertir ese código en una función escalar.

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

    y la aplicas, quedando el código más claro y simple.

    Select 
    		dbo.dateTimeDifInDaysHoursMinuteAndSecond (Alta, UltimaActualizacion) as [diferencia]
    	From dbo.M_OT


    Si también quieres el total en la misma fila, una posible solución puede ser.

    ;with cte as (
    
    Select dbo.datetimedifindayshoursminuteandsecond
    	   ( alta, ultimaactualizacion ) As diferencia
    	 , alta
    	 , ultimaactualizacion
    	 , DateDiff(second, alta, ultimaactualizacion) As difsec
    	   From dbo.m_ot;
    ), total as (
    select sum(difSec) as total from cte 
    )
    Select cte.*,		
    			CONVERT(VARCHAR(12),tOTAL.TOTAL / 60 / 60 / 24) 
    	+ ':' + CONVERT(VARCHAR(12),tOTAL.TOTAL / 60 / 60 % 24) 
    	+ ':' + CONVERT(VARCHAR(2), tOTAL.TOTAL / 60 % 60) 
    	+ ':' + CONVERT(VARCHAR(2), tOTAL.TOTAL % 60) AS Dif 
    	from cte cross join total 

    Utilizar un cte correlativo. En el primer conjunto extraes los datos que necesitas de la tabla y calculas la diferencia en segundos para obtener el total de la partida.

    En el segundo cte calculas el total.

    En la salida obtienes los datos a visualizar del cte y le haces un cross join al total, para tenerlo en todas las filas.

    DateDiff

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

    Funciones de fecha útiles

    https://javifer2.wordpress.com/2019/12/15/funciones-de-fecha-para-datetime-utiles/

    Cte correlativo

    https://javifer2.wordpress.com/2018/12/18/with-cte-tablas-de-expresion-comun-2-correlativos/

    • Marcado como respuesta Alejandro 0991 jueves, 31 de diciembre de 2020 14:19
    jueves, 31 de diciembre de 2020 5:52
  • Muchísimas gracias Javi Fernández :D

    Hasta donde veo a simple vista y viendo los códigos que me proporcionas, estoy seguro que con eso se resuelve, en caso que tenga dudas, te las hago saber.

    En vdd te agradezco muchísimo tu ayuda y tu tiempo :D

    Saludos.

    jueves, 31 de diciembre de 2020 14:23
  • Había enviado otra respuesta pero me marcó error al darle en Enviar, pero bueno nuevamente te comento lo que he hecho y nuevamente dónde me detuve:

    Logré realizar la consulta como me comentabas de la siguiente forma:

    	SELECT 
    		d.OT, d.ALTA,ULTIMAACTUALIZACION,dbo.difentrehoras (Alta, UltimaActualizacion) as 'TIEMPO MUERTO', 
    		DateDiff(second, ALTA, ULTIMAACTUALIZACION) As DIFSEC,	    
    		d.EQUIPO, d.TITULO
        FROM dbo.M_OT d
    	WHERE CAST(D.ALTA AS DATE) between '2020-12-01' and GETDATE()  AND d.EQUIPO='ALP-01'

    Obteniendo el siguiente resultado:

    OT	ALTA                    	ULTIMAACTUALIZACION      	TIEMPO MUERTO                           	DIFSEC	EQUIPO	TITULO
    3957	2020/12/11 05:07:46 p. m.	2020/12/22 05:23:32 p. m.	11 días: 0 horas: 15 minutos: 46 segundos	951346	ALP-01	ALPINE 1
    3999	2020/12/15 11:07:14 p. m.	2020/12/22 05:23:31 p. m.	6 días: 18 horas: 16 minutos: 17 segundos	584177	ALP-01	ALPINE 1
    4017	2020/12/16 10:26:53 p. m.	2020/12/22 05:24:51 p. m.	5 días: 18 horas: 57 minutos: 58 segundos	500278	ALP-01	ALPINE 1
    4083	2020/12/23 06:07:58 a. m.	2020/12/23 09:29:32 a. m.	0 días: 3 horas: 21 minutos: 34 segundos	12094	ALP-01	ALPINE 1
    

    Hasta aquí todo va bien, y a la hora de hacer el de la suma total obtengo el siguiente resultado, (tal como me lo planteaste anteriormente):

    ;with cte as (
    
    Select 
    	d.OT, d.ALTA,ULTIMAACTUALIZACION,dbo.difentrehoras (Alta, UltimaActualizacion) as 'TIEMPO MUERTO', 
    	DateDiff(second, ALTA, ULTIMAACTUALIZACION) As DIFSEC,	    
    	d.EQUIPO, d.TITULO
        FROM dbo.M_OT d
    WHERE CAST(D.ALTA AS DATE) between '2020-12-01' and GETDATE()  AND d.EQUIPO='ALP-01'         
    ), total as (
    select sum(DIFSEC) as total from cte    
    )
    Select cte.*,		
    	CONVERT(VARCHAR(12),total.total / 60 / 60 / 24) 
    	+ ' días : ' + CONVERT(VARCHAR(12), total.total / 60 / 60 % 24) 
    	+ ' horas : ' + CONVERT(VARCHAR(2), total.total / 60 % 60) 
    	+ ' minutos : ' + CONVERT(VARCHAR(2), total.total % 60)+ ' segundos' AS TMUERTO                          
    	from cte cross join total 
    	ORDER BY EQUIPO ASC

    Y su resultado:

    OT	ALTA                    	ULTIMAACTUALIZACION        	TIEMPO MUERTO                            	DIFSEC	EQUIPO	TITULO   	TMUERTO
    3957	2020/12/11 05:07:46 p. m.	2020/12/22 05:23:32 p. m.	11 días: 0 horas: 15 minutos: 46 segundos	951346	ALP-01	ALPINE 1	23 días : 16 horas : 51 minutos : 35 segundos
    3999	2020/12/15 11:07:14 p. m.	2020/12/22 05:23:31 p. m.	6 días: 18 horas: 16 minutos: 17 segundos	584177	ALP-01	ALPINE 1	23 días : 16 horas : 51 minutos : 35 segundos
    4017	2020/12/16 10:26:53 p. m.	2020/12/22 05:24:51 p. m.	5 días: 18 horas: 57 minutos: 58 segundos	500278	ALP-01	ALPINE 1	23 días : 16 horas : 51 minutos : 35 segundos
    4083	2020/12/23 06:07:58 a. m.	2020/12/23 09:29:32 a. m.	0 días: 3 horas: 21 minutos: 34 segundos	12094	ALP-01	ALPINE 1	23 días : 16 horas : 51 minutos : 35 segundos
    

    Hasta aquí todo marcha muy bien; salvo que en el ejemplo inicial herré con un detalle, dejé la en la cláusula WHERE la condición AND d.EQUIPO='ALP-01' ahora el detalle es que si yo le quito esta condición, por ende tengo otros equipos diferentes a ALP-01, y por ende la sumatoria de TMUERTO va a cambiar, algo así:

    ;with cte as (
    
    Select 
    		d.OT, d.ALTA,ULTIMAACTUALIZACION,dbo.difentrehoras (Alta, UltimaActualizacion) as 'TIEMPO MUERTO', 
    		DateDiff(second, ALTA, ULTIMAACTUALIZACION) As DIFSEC,	    
    		d.EQUIPO, d.TITULO
        FROM dbo.M_OT d
    WHERE CAST(D.ALTA AS DATE) between '2020-12-01' and GETDATE()         
    ), total as (
    select sum(DIFSEC) as total from cte    
    )
    Select cte.*,		
    			CONVERT(VARCHAR(12),total.total / 60 / 60 / 24) 
    	+ ' días : ' + CONVERT(VARCHAR(12), total.total / 60 / 60 % 24) 
    	+ ' horas : ' + CONVERT(VARCHAR(2), total.total / 60 % 60) 
    	+ ' minutos : ' + CONVERT(VARCHAR(2), total.total % 60)+ ' segundos' AS TMUERTO                          
    	from cte cross join total 
    	ORDER BY EQUIPO ASC

    Y su resultado:

    OT	ALTA                     	ULTIMAACTUALIZACION        	TIEMPO MUERTO                             	DIFSEC	EQUIPO	TITULO    	TMUERTO
    3957	2020/12/11 05:07:46 p. m.	2020/12/22 05:23:32 p. m.	11 días: 0 horas: 15 minutos: 46 segundos	951346	ALP-01	ALPINE 1	41 días : 16 horas : 1 minutos : 16 segundos
    3999	2020/12/15 11:07:14 p. m.	2020/12/22 05:23:31 p. m.	6 días: 18 horas: 16 minutos: 17 segundos	584177	ALP-01	ALPINE 1	41 días : 16 horas : 1 minutos : 16 segundos
    4017	2020/12/16 10:26:53 p. m.	2020/12/22 05:24:51 p. m.	5 días: 18 horas: 57 minutos: 58 segundos	500278	ALP-01	ALPINE 1	41 días : 16 horas : 1 minutos : 16 segundos
    4083	2020/12/23 06:07:58 a. m.	2020/12/23 09:29:32 a. m.	0 días: 3 horas: 21 minutos: 34 segundos	12094	ALP-01	ALPINE 1	41 días : 16 horas : 1 minutos : 16 segundos
    4139	2020/12/30 04:32:44 a. m.	2020/12/30 06:22:30 p. m.	0 días: 13 horas: 49 minutos: 46 segundos	49786	ALP-02	ALPINE 2	41 días : 16 horas : 1 minutos : 16 segundos
    4119	2020/12/28 02:18:51 p. m.	2020/12/29 06:33:53 p. m.	1 días: 4 horas: 15 minutos: 2 segundos  	101702	ALP-02	ALPINE 2	41 días : 16 horas : 1 minutos : 16 segundos
    4059	2020/12/21 06:22:56 a. m.	2020/12/21 01:55:32 p. m.	0 días: 7 horas: 32 minutos: 36 segundos	27156	ALP-02	ALPINE 2	41 días : 16 horas : 1 minutos : 16 segundos
    4066	2020/12/22 04:49:34 a. m.	2020/12/22 04:51:54 p. m.	0 días: 12 horas: 2 minutos: 20 segundos	43340	ALP-02	ALPINE 2	41 días : 16 horas : 1 minutos : 16 segundos
    4066	2020/12/22 04:49:34 a. m.	2020/12/22 04:51:54 p. m.	0 días: 12 horas: 2 minutos: 20 segundos	43340	ALP-02	ALPINE 2	41 días : 16 horas : 1 minutos : 16 segundos
    4048	2020/12/19 06:34:32 p. m.	2020/12/21 02:01:10 p. m.	1 días: 19 horas: 26 minutos: 38 segundos	156398	ALP-02	ALPINE 2	41 días : 16 horas : 1 minutos : 16 segundos
    3945	2020/12/11 05:15:19 a. m.	2020/12/14 01:59:02 p. m.	3 días: 8 horas: 43 minutos: 43 segundos	290623	ALP-02	ALPINE 2	41 días : 16 horas : 1 minutos : 16 segundos
    3937	2020/12/10 09:48:39 a. m.	2020/12/15 12:54:09 p. m.	5 días: 3 horas: 5 minutos: 30 segundos 	443130	ALP-03	ALPINE 3	41 días : 16 horas : 1 minutos : 16 segundos
    3989	2020/12/14 05:27:25 p. m.	2020/12/15 12:38:53 p. m.	0 días: 19 horas: 11 minutos: 28 segundos	69088	ALP-03	ALPINE 3	41 días : 16 horas : 1 minutos : 16 segundos
    4125	2020/12/28 07:43:20 p. m.	2020/12/29 06:27:47 p. m.	0 días: 22 horas: 44 minutos: 27 segundos	81867	ALP-03	ALPINE 3	41 días : 16 horas : 1 minutos : 16 segundos
    4125	2020/12/28 07:43:20 p. m.	2020/12/29 06:27:47 p. m.	0 días: 22 horas: 44 minutos: 27 segundos	81867	ALP-03	ALPINE 3	41 días : 16 horas : 1 minutos : 16 segundos
    4125	2020/12/28 07:43:20 p. m.	2020/12/29 06:27:47 p. m.	0 días: 22 horas: 44 minutos: 27 segundos	81867	ALP-03	ALPINE 3	41 días : 16 horas : 1 minutos : 16 segundos
    4108	2020/12/27 09:26:35 a. m.	2020/12/28 08:13:32 a. m.	0 días: 22 horas: 46 minutos: 57 segundos	82017	ALP-03	ALPINE 3	41 días : 16 horas : 1 minutos : 16 segundos
    

    Después se me ocurrió una idea, fue hacer un group by por equipo, dejándolo algo así:

    ;with cte as (
    
    Select 
    		d.OT, d.ALTA,ULTIMAACTUALIZACION,dbo.difentrehoras (Alta, UltimaActualizacion) as 'TIEMPO MUERTO', 
    		DateDiff(second, ALTA, ULTIMAACTUALIZACION) As DIFSEC,	    
    		d.EQUIPO, d.TITULO
        FROM dbo.M_OT d
    WHERE CAST(D.ALTA AS DATE) between '2020-12-01' and GETDATE()         
    ), total as (
    select sum(DIFSEC) as total,EQUIPO from cte
    group by EQUIPO  
    )
    Select cte.*,		
    			CONVERT(VARCHAR(12),total.total / 60 / 60 / 24) 
    	+ ' días : ' + CONVERT(VARCHAR(12), total.total / 60 / 60 % 24) 
    	+ ' horas : ' + CONVERT(VARCHAR(2), total.total / 60 % 60) 
    	+ ' minutos : ' + CONVERT(VARCHAR(2), total.total % 60)+ ' segundos' AS TMUERTO                          
    	from cte cross join total 
    	ORDER BY EQUIPO ASC

    Pero en el resultado me muestra 3 veces cada uno de ellos, es decir, si en la consulta anterior me arrojó 17 registros, con esta otra consulta me muestra 51:

    OT	ALTA                    	ULTIMAACTUALIZACION      	TIEMPO MUERTO                            	DIFSEC	EQUIPO	TITULO   	TMUERTO
    3957	2020/12/11 05:07:46 p. m.	2020/12/22 05:23:32 p. m.	11 días: 0 horas: 15 minutos: 46 segundos	951346	ALP-01	ALPINE 1	23 días : 16 horas : 51 minutos : 35 segundos
    3999	2020/12/15 11:07:14 p. m.	2020/12/22 05:23:31 p. m.	6 días: 18 horas: 16 minutos: 17 segundos	584177	ALP-01	ALPINE 1	23 días : 16 horas : 51 minutos : 35 segundos
    4017	2020/12/16 10:26:53 p. m.	2020/12/22 05:24:51 p. m.	5 días: 18 horas: 57 minutos: 58 segundos	500278	ALP-01	ALPINE 1	23 días : 16 horas : 51 minutos : 35 segundos
    4083	2020/12/23 06:07:58 a. m.	2020/12/23 09:29:32 a. m.	0 días: 3 horas: 21 minutos: 34 segundos	12094	ALP-01	ALPINE 1	23 días : 16 horas : 51 minutos : 35 segundos
    3957	2020/12/11 05:07:46 p. m.	2020/12/22 05:23:32 p. m.	11 días: 0 horas: 15 minutos: 46 segundos	951346	ALP-01	ALPINE 1	8 días : 5 horas : 52 minutos : 25 segundos
    3999	2020/12/15 11:07:14 p. m.	2020/12/22 05:23:31 p. m.	6 días: 18 horas: 16 minutos: 17 segundos	584177	ALP-01	ALPINE 1	8 días : 5 horas : 52 minutos : 25 segundos
    4017	2020/12/16 10:26:53 p. m.	2020/12/22 05:24:51 p. m.	5 días: 18 horas: 57 minutos: 58 segundos	500278	ALP-01	ALPINE 1	8 días : 5 horas : 52 minutos : 25 segundos
    4083	2020/12/23 06:07:58 a. m.	2020/12/23 09:29:32 a. m.	0 días: 3 horas: 21 minutos: 34 segundos	12094	ALP-01	ALPINE 1	8 días : 5 horas : 52 minutos : 25 segundos
    3957	2020/12/11 05:07:46 p. m.	2020/12/22 05:23:32 p. m.	11 días: 0 horas: 15 minutos: 46 segundos	951346	ALP-01	ALPINE 1	9 días : 17 horas : 17 minutos : 16 segundos
    3999	2020/12/15 11:07:14 p. m.	2020/12/22 05:23:31 p. m.	6 días: 18 horas: 16 minutos: 17 segundos	584177	ALP-01	ALPINE 1	9 días : 17 horas : 17 minutos : 16 segundos
    4017	2020/12/16 10:26:53 p. m.	2020/12/22 05:24:51 p. m.	5 días: 18 horas: 57 minutos: 58 segundos	500278	ALP-01	ALPINE 1	9 días : 17 horas : 17 minutos : 16 segundos
    4083	2020/12/23 06:07:58 a. m.	2020/12/23 09:29:32 a. m.	0 días: 3 horas: 21 minutos: 34 segundos	12094	ALP-01	ALPINE 1	9 días : 17 horas : 17 minutos : 16 segundos
    3945	2020/12/11 05:15:19 a. m.	2020/12/14 01:59:02 p. m.	3 días: 8 horas: 43 minutos: 43 segundos	290623	ALP-02	ALPINE 2	9 días : 17 horas : 17 minutos : 16 segundos
    4059	2020/12/21 06:22:56 a. m.	2020/12/21 01:55:32 p. m.	0 días: 7 horas: 32 minutos: 36 segundos	27156	ALP-02	ALPINE 2	9 días : 17 horas : 17 minutos : 16 segundos
    4066	2020/12/22 04:49:34 a. m.	2020/12/22 04:51:54 p. m.	0 días: 12 horas: 2 minutos: 20 segundos	43340	ALP-02	ALPINE 2	9 días : 17 horas : 17 minutos : 16 segundos
    4066	2020/12/22 04:49:34 a. m.	2020/12/22 04:51:54 p. m.	0 días: 12 horas: 2 minutos: 20 segundos	43340	ALP-02	ALPINE 2	9 días : 17 horas : 17 minutos : 16 segundos
    4119	2020/12/28 02:18:51 p. m.	2020/12/29 06:33:53 p. m.	1 días: 4 horas: 15 minutos: 2 segundos  	101702	ALP-02	ALPINE 2	9 días : 17 horas : 17 minutos : 16 segundos
    4139	2020/12/30 04:32:44 a. m.	2020/12/30 06:22:30 p. m.	0 días: 13 horas: 49 minutos: 46 segundos	49786	ALP-02	ALPINE 2	9 días : 17 horas : 17 minutos : 16 segundos
    4048	2020/12/19 06:34:32 p. m.	2020/12/21 02:01:10 p. m.	1 días: 19 horas: 26 minutos: 38 segundos	156398	ALP-02	ALPINE 2	9 días : 17 horas : 17 minutos : 16 segundos
    4059	2020/12/21 06:22:56 a. m.	2020/12/21 01:55:32 p. m.	0 días: 7 horas: 32 minutos: 36 segundos	27156	ALP-02	ALPINE 2	8 días : 5 horas : 52 minutos : 25 segundos
    4066	2020/12/22 04:49:34 a. m.	2020/12/22 04:51:54 p. m.	0 días: 12 horas: 2 minutos: 20 segundos	43340	ALP-02	ALPINE 2	8 días : 5 horas : 52 minutos : 25 segundos
    4066	2020/12/22 04:49:34 a. m.	2020/12/22 04:51:54 p. m.	0 días: 12 horas: 2 minutos: 20 segundos	43340	ALP-02	ALPINE 2	8 días : 5 horas : 52 minutos : 25 segundos
    4119	2020/12/28 02:18:51 p. m.	2020/12/29 06:33:53 p. m.	1 días: 4 horas: 15 minutos: 2 segundos  	101702	ALP-02	ALPINE 2	8 días : 5 horas : 52 minutos : 25 segundos
    4139	2020/12/30 04:32:44 a. m.	2020/12/30 06:22:30 p. m.	0 días: 13 horas: 49 minutos: 46 segundos	49786	ALP-02	ALPINE 2	8 días : 5 horas : 52 minutos : 25 segundos
    4048	2020/12/19 06:34:32 p. m.	2020/12/21 02:01:10 p. m.	1 días: 19 horas: 26 minutos: 38 segundos	156398	ALP-02	ALPINE 2	8 días : 5 horas : 52 minutos : 25 segundos
    4139	2020/12/30 04:32:44 a. m.	2020/12/30 06:22:30 p. m.	0 días: 13 horas: 49 minutos: 46 segundos	49786	ALP-02	ALPINE 2	23 días : 16 horas : 51 minutos : 35 segundos
    3945	2020/12/11 05:15:19 a. m.	2020/12/14 01:59:02 p. m.	3 días: 8 horas: 43 minutos: 43 segundos	290623	ALP-02	ALPINE 2	23 días : 16 horas : 51 minutos : 35 segundos
    3945	2020/12/11 05:15:19 a. m.	2020/12/14 01:59:02 p. m.	3 días: 8 horas: 43 minutos: 43 segundos	290623	ALP-02	ALPINE 2	8 días : 5 horas : 52 minutos : 25 segundos
    4119	2020/12/28 02:18:51 p. m.	2020/12/29 06:33:53 p. m.	1 días: 4 horas: 15 minutos: 2 segundos  	101702	ALP-02	ALPINE 2	23 días : 16 horas : 51 minutos : 35 segundos
    4059	2020/12/21 06:22:56 a. m.	2020/12/21 01:55:32 p. m.	0 días: 7 horas: 32 minutos: 36 segundos	27156	ALP-02	ALPINE 2	23 días : 16 horas : 51 minutos : 35 segundos
    4066	2020/12/22 04:49:34 a. m.	2020/12/22 04:51:54 p. m.	0 días: 12 horas: 2 minutos: 20 segundos	43340	ALP-02	ALPINE 2	23 días : 16 horas : 51 minutos : 35 segundos
    4066	2020/12/22 04:49:34 a. m.	2020/12/22 04:51:54 p. m.	0 días: 12 horas: 2 minutos: 20 segundos	43340	ALP-02	ALPINE 2	23 días : 16 horas : 51 minutos : 35 segundos
    4048	2020/12/19 06:34:32 p. m.	2020/12/21 02:01:10 p. m.	1 días: 19 horas: 26 minutos: 38 segundos	156398	ALP-02	ALPINE 2	23 días : 16 horas : 51 minutos : 35 segundos
    3937	2020/12/10 09:48:39 a. m.	2020/12/15 12:54:09 p. m.	5 días: 3 horas: 5 minutos: 30 segundos 	443130	ALP-03	ALPINE 3	23 días : 16 horas : 51 minutos : 35 segundos
    3989	2020/12/14 05:27:25 p. m.	2020/12/15 12:38:53 p. m.	0 días: 19 horas: 11 minutos: 28 segundos	69088	ALP-03	ALPINE 3	23 días : 16 horas : 51 minutos : 35 segundos
    4125	2020/12/28 07:43:20 p. m.	2020/12/29 06:27:47 p. m.	0 días: 22 horas: 44 minutos: 27 segundos	81867	ALP-03	ALPINE 3	23 días : 16 horas : 51 minutos : 35 segundos
    4125	2020/12/28 07:43:20 p. m.	2020/12/29 06:27:47 p. m.	0 días: 22 horas: 44 minutos: 27 segundos	81867	ALP-03	ALPINE 3	23 días : 16 horas : 51 minutos : 35 segundos
    4125	2020/12/28 07:43:20 p. m.	2020/12/29 06:27:47 p. m.	0 días: 22 horas: 44 minutos: 27 segundos	81867	ALP-03	ALPINE 3	23 días : 16 horas : 51 minutos : 35 segundos
    4108	2020/12/27 09:26:35 a. m.	2020/12/28 08:13:32 a. m.	0 días: 22 horas: 46 minutos: 57 segundos	82017	ALP-03	ALPINE 3	23 días : 16 horas : 51 minutos : 35 segundos
    3937	2020/12/10 09:48:39 a. m.	2020/12/15 12:54:09 p. m.	5 días: 3 horas: 5 minutos: 30 segundos 	443130	ALP-03	ALPINE 3	8 días : 5 horas : 52 minutos : 25 segundos
    3989	2020/12/14 05:27:25 p. m.	2020/12/15 12:38:53 p. m.	0 días: 19 horas: 11 minutos: 28 segundos	69088	ALP-03	ALPINE 3	8 días : 5 horas : 52 minutos : 25 segundos
    4125	2020/12/28 07:43:20 p. m.	2020/12/29 06:27:47 p. m.	0 días: 22 horas: 44 minutos: 27 segundos	81867	ALP-03	ALPINE 3	8 días : 5 horas : 52 minutos : 25 segundos
    4125	2020/12/28 07:43:20 p. m.	2020/12/29 06:27:47 p. m.	0 días: 22 horas: 44 minutos: 27 segundos	81867	ALP-03	ALPINE 3	8 días : 5 horas : 52 minutos : 25 segundos
    4125	2020/12/28 07:43:20 p. m.	2020/12/29 06:27:47 p. m.	0 días: 22 horas: 44 minutos: 27 segundos	81867	ALP-03	ALPINE 3	8 días : 5 horas : 52 minutos : 25 segundos
    4108	2020/12/27 09:26:35 a. m.	2020/12/28 08:13:32 a. m.	0 días: 22 horas: 46 minutos: 57 segundos	82017	ALP-03	ALPINE 3	8 días : 5 horas : 52 minutos : 25 segundos
    3937	2020/12/10 09:48:39 a. m.	2020/12/15 12:54:09 p. m.	5 días: 3 horas: 5 minutos: 30 segundos 	443130	ALP-03	ALPINE 3	9 días : 17 horas : 17 minutos : 16 segundos
    3989	2020/12/14 05:27:25 p. m.	2020/12/15 12:38:53 p. m.	0 días: 19 horas: 11 minutos: 28 segundos	69088	ALP-03	ALPINE 3	9 días : 17 horas : 17 minutos : 16 segundos
    4125	2020/12/28 07:43:20 p. m.	2020/12/29 06:27:47 p. m.	0 días: 22 horas: 44 minutos: 27 segundos	81867	ALP-03	ALPINE 3	9 días : 17 horas : 17 minutos : 16 segundos
    4125	2020/12/28 07:43:20 p. m.	2020/12/29 06:27:47 p. m.	0 días: 22 horas: 44 minutos: 27 segundos	81867	ALP-03	ALPINE 3	9 días : 17 horas : 17 minutos : 16 segundos
    4125	2020/12/28 07:43:20 p. m.	2020/12/29 06:27:47 p. m.	0 días: 22 horas: 44 minutos: 27 segundos	81867	ALP-03	ALPINE 3	9 días : 17 horas : 17 minutos : 16 segundos
    4108	2020/12/27 09:26:35 a. m.	2020/12/28 08:13:32 a. m.	0 días: 22 horas: 46 minutos: 57 segundos	82017	ALP-03	ALPINE 3	9 días : 17 horas : 17 minutos : 16 segundos
    

    Y el resultado de TMUERTO del mismo modo me lo arroja diferente :/

    No se si esté cercas de lo que busco o si de plano estoy muy pero muy perdido.

    Espero puedas apoyarme nuevamente, de antemano muchas gracias por tu tiempo Javi.

    Saludos.

    jueves, 31 de diciembre de 2020 20:11
  • Bueno seguí intentando y probé con lo siguiente, no se si esté bien ejecutado o no, pero al parecer da el resultado:

    ;with cte as (
    
    Select 
    		d.OT, d.ALTA,ULTIMAACTUALIZACION,dbo.difentrehoras (Alta, UltimaActualizacion) as 'TIEMPO MUERTO', 
    		DateDiff(second, ALTA, ULTIMAACTUALIZACION) As DIFSEC,	    
    		d.EQUIPO, d.TITULO
        FROM dbo.M_OT d
    WHERE CAST(D.ALTA AS DATE) between '2020-12-01' and GETDATE()         
    ), total as (
    select sum(DIFSEC) as total,EQUIPO from cte
    group by EQUIPO  
    )
    Select cte.*,		
    			CONVERT(VARCHAR(12),total.total / 60 / 60 / 24) 
    	+ ' días : ' + CONVERT(VARCHAR(12), total.total / 60 / 60 % 24) 
    	+ ' horas : ' + CONVERT(VARCHAR(2), total.total / 60 % 60) 
    	+ ' minutos : ' + CONVERT(VARCHAR(2), total.total % 60)+ ' segundos' AS TMUERTO                          
    	from cte cross join total 
    	WHERE cte.EQUIPO=total.EQUIPO
    	ORDER BY EQUIPO ASC

    Agregué al final del último SELECT una cláusula WHERE de la forma "WHERE cte.EQUIPO=total.EQUIPO" y me arroja el resultado siguiente:

    OT      	ALTA             	ULTIMAACTUALIZACION      	TIEMPO MUERTO                           	DIFSEC	EQUIPO	TITULO          	TMUERTO
    3957	2020/12/11 05:07:46 p. m.	2020/12/22 05:23:32 p. m.	11 días: 0 horas: 15 minutos: 46 segundos	951346	ALP-01	ALPINE 1	23 días : 16 horas : 51 minutos : 35 segundos
    3999	2020/12/15 11:07:14 p. m.	2020/12/22 05:23:31 p. m.	6 días: 18 horas: 16 minutos: 17 segundos	584177	ALP-01	ALPINE 1	23 días : 16 horas : 51 minutos : 35 segundos
    4017	2020/12/16 10:26:53 p. m.	2020/12/22 05:24:51 p. m.	5 días: 18 horas: 57 minutos: 58 segundos	500278	ALP-01	ALPINE 1	23 días : 16 horas : 51 minutos : 35 segundos
    4083	2020/12/23 06:07:58 a. m.	2020/12/23 09:29:32 a. m.	0 días: 3 horas: 21 minutos: 34 segundos	12094	ALP-01	ALPINE 1	23 días : 16 horas : 51 minutos : 35 segundos
    3945	2020/12/11 05:15:19 a. m.	2020/12/14 01:59:02 p. m.	3 días: 8 horas: 43 minutos: 43 segundos	290623	ALP-02	ALPINE 2	8 días : 5 horas : 52 minutos : 25 segundos
    4048	2020/12/19 06:34:32 p. m.	2020/12/21 02:01:10 p. m.	1 días: 19 horas: 26 minutos: 38 segundos	156398	ALP-02	ALPINE 2	8 días : 5 horas : 52 minutos : 25 segundos
    4059	2020/12/21 06:22:56 a. m.	2020/12/21 01:55:32 p. m.	0 días: 7 horas: 32 minutos: 36 segundos	27156	ALP-02	ALPINE 2	8 días : 5 horas : 52 minutos : 25 segundos
    4066	2020/12/22 04:49:34 a. m.	2020/12/22 04:51:54 p. m.	0 días: 12 horas: 2 minutos: 20 segundos	43340	ALP-02	ALPINE 2	8 días : 5 horas : 52 minutos : 25 segundos
    4066	2020/12/22 04:49:34 a. m.	2020/12/22 04:51:54 p. m.	0 días: 12 horas: 2 minutos: 20 segundos	43340	ALP-02	ALPINE 2	8 días : 5 horas : 52 minutos : 25 segundos
    4119	2020/12/28 02:18:51 p. m.	2020/12/29 06:33:53 p. m.	1 días: 4 horas: 15 minutos: 2 segundos  	101702	ALP-02	ALPINE 2	8 días : 5 horas : 52 minutos : 25 segundos
    4139	2020/12/30 04:32:44 a. m.	2020/12/30 06:22:30 p. m.	0 días: 13 horas: 49 minutos: 46 segundos	49786	ALP-02	ALPINE 2	8 días : 5 horas : 52 minutos : 25 segundos
    3937	2020/12/10 09:48:39 a. m.	2020/12/15 12:54:09 p. m.	5 días: 3 horas: 5 minutos: 30 segundos  	443130	ALP-03	ALPINE 3	9 días : 17 horas : 17 minutos : 16 segundos
    3989	2020/12/14 05:27:25 p. m.	2020/12/15 12:38:53 p. m.	0 días: 19 horas: 11 minutos: 28 segundos	69088	ALP-03	ALPINE 3	9 días : 17 horas : 17 minutos : 16 segundos
    4108	2020/12/27 09:26:35 a. m.	2020/12/28 08:13:32 a. m.	0 días: 22 horas: 46 minutos: 57 segundos	82017	ALP-03	ALPINE 3	9 días : 17 horas : 17 minutos : 16 segundos
    4125	2020/12/28 07:43:20 p. m.	2020/12/29 06:27:47 p. m.	0 días: 22 horas: 44 minutos: 27 segundos	81867	ALP-03	ALPINE 3	9 días : 17 horas : 17 minutos : 16 segundos
    4125	2020/12/28 07:43:20 p. m.	2020/12/29 06:27:47 p. m.	0 días: 22 horas: 44 minutos: 27 segundos	81867	ALP-03	ALPINE 3	9 días : 17 horas : 17 minutos : 16 segundos
    4125	2020/12/28 07:43:20 p. m.	2020/12/29 06:27:47 p. m.	0 días: 22 horas: 44 minutos: 27 segundos	81867	ALP-03	ALPINE 3	9 días : 17 horas : 17 minutos : 16 segundos
    

    No se si esté bien ejecutado pero al menos, veo que sí está dando los resultados bien jejeje

    No se si hay algo que pueda mejorarlo o pueda hacerse mejor :)

    De antemano muchas gracias en vdd ya que con tu ayuda eh ido aprendiendo un montón con cosas que siempre he tenido dudas.

    Saludos.

    jueves, 31 de diciembre de 2020 20:34
  • Hola Alejandro0991:

    Es una opción, bastante válida.

    Si tienes problemas de rendimiento, se podría pensar en cambiarlo por una función de ventana. Pero sino está muy bien.


    viernes, 1 de enero de 2021 9:05