Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

[SOLUCIONADO] Consulta SQL resta de 2 fechas en el mismo campo en distinto registro. (con condición

Estas en el tema de Consulta SQL resta de 2 fechas en el mismo campo en distinto registro. (con condición en el foro de SQL Server en Foros del Web. Hola, estimados compañeros tengo una duda sobre si se puede hacer o no una consulta con las sgtes caracteristicas: con una tabla perecida a esta: ...
  #1 (permalink)  
Antiguo 22/10/2013, 06:44
 
Fecha de Ingreso: junio-2006
Mensajes: 34
Antigüedad: 17 años, 10 meses
Puntos: 1
Consulta SQL resta de 2 fechas en el mismo campo en distinto registro. (con condición

Hola, estimados compañeros tengo una duda sobre si se puede hacer o no una consulta con las sgtes caracteristicas:

con una tabla perecida a esta:

id - Fecha - Estado

1 - 01-01-2013 08:00 - inicio

1 - 01-01-2013 10:00 - fin

1 - 01-01-2013 13:00 - inicio

1 - 01-01-2013 13:30 - fin

1 - 01-01-2013 13:40 - fin

1 - 01-01-2013 14:00 - inicio

1 - 01-01-2013 14:30 - inicio

1 - 01-01-2013 15:40 - fin

La idea es poder restar las horas entre el primer inicio y el ultimo fin (por cada inicio) por ejemplo en este caso quedaria

10:00 - 08:00

13:40 - 13:00

15:40 - 14:00

Se puede hacer por consulta?


Muchas Gracias.
  #2 (permalink)  
Antiguo 22/10/2013, 07:59
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta SQL resta de 2 fechas en el mismo campo en distinto registro. (co

si se puede pero con la estructura de datos que mencionas no, porque? porque no sabes que inicio o que fin le corresponde a cada "evento" como se cual es el primer inicio? como se que fin le corresponde a cada inicio??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 22/10/2013, 09:22
 
Fecha de Ingreso: junio-2006
Mensajes: 34
Antigüedad: 17 años, 10 meses
Puntos: 1
Respuesta: Consulta SQL resta de 2 fechas en el mismo campo en distinto registro. (co

Ese es el problema, debo considerar el primer inicio y el próximo fin seria el que este antes de un inicio.
Sobre el inicio y el fin.. la lógica es esta:

Se tomar el primer inicio luego se buscar el ultimo fin antes de un inicio, luego se repite el ciclo.
Pensaba que algo se podía hacer el sql.

Pude crear algo así:
Esto me deja en un registro el inicio y el fin, pero no me soluciona el problema que exista un segundo fin luego del anterior.
Código SQL:
Ver original
  1. SELECT
  2. DISTINCT  
  3.   CONVERT(VARCHAR(10),s.DATE, 103) AS fecha,  
  4.   (SELECT  
  5.    MIN(CONVERT(VARCHAR(5),x.DATE,108))
  6.   FROM TABLA_Datos AS x
  7.   WHERE
  8.   estado IN('Inicio') AND CONVERT(VARCHAR(10),x.DATE, 103)
  9.   = CONVERT(VARCHAR(10),s.DATE, 103)) AS encendido,
  10.   (SELECT  
  11.  MAX(CONVERT(VARCHAR(5),x.DATE,108))
  12.   FROM TABLA_Datos AS x
  13.   WHERE
  14.   estado IN('Fin') AND CONVERT(VARCHAR(10),x.DATE, 103)
  15.   = CONVERT(VARCHAR(10),s.DATE, 103)) AS apagado
  16.   FROM FROM TABLA_Datos AS s
  17.   WHERE
  18.   estado IN('Inicio')
  19.   AND   DATE BETWEEN  '20130601' AND '20131230'  
  20.   AND id= 61
  21.   GROUP BY DATE


gracias

Última edición por gnzsoloyo; 26/10/2013 a las 21:34
  #4 (permalink)  
Antiguo 22/10/2013, 09:33
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Consulta SQL resta de 2 fechas en el mismo campo en distinto registro. (co

Coincido con Libras, pésima estructura de la tabla
__________________
MCTS Isaias Islas
  #5 (permalink)  
Antiguo 22/10/2013, 10:00
 
Fecha de Ingreso: junio-2006
Mensajes: 34
Antigüedad: 17 años, 10 meses
Puntos: 1
Respuesta: Consulta SQL resta de 2 fechas en el mismo campo en distinto registro. (co

compañeros.. la estructura venia, de hecho lo estoy tomando de una maquina que registra los inicios y los fin.. ante esta estructura no puedo hacer nada, solo necesito poder sacar la info en una SQL.
tienen alguna idea que me puedan dar?

muchas gracias.
  #6 (permalink)  
Antiguo 22/10/2013, 10:32
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta SQL resta de 2 fechas en el mismo campo en distinto registro. (co

se me ocurre que puedes hacer esto:

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. id INT,
  4. fecha datetime,
  5. estado VARCHAR(20),
  6. rn INT IDENTITY(1,1)
  7. )
  8.  
  9.  
  10.  
  11. INSERT INTO #temp VALUES (1,'01-01-2013 08:00','inicio')
  12.  
  13. INSERT INTO #temp VALUES (1,'01-01-2013 10:00','fin')
  14.  
  15. INSERT INTO #temp VALUES (1,'01-01-2013 13:00','inicio')
  16.  
  17. INSERT INTO #temp VALUES (1,'01-01-2013 13:30','fin')
  18.  
  19. INSERT INTO #temp VALUES (1,'01-01-2013 13:40','fin')
  20.  
  21. INSERT INTO #temp VALUES (1,'01-01-2013 14:00','inicio')
  22.  
  23. INSERT INTO #temp VALUES (1,'01-01-2013 14:30','inicio')
  24.  
  25. INSERT INTO #temp VALUES (1,'01-01-2013 15:40','fin')
  26.  
  27.  
  28.  
  29. DECLARE @x INT
  30. DECLARE @resultado TABLE (inicio datetime,fin datetime, horas INT)
  31. DECLARE @inicio datetime
  32. DECLARE @fin datetime
  33. DECLARE @horas INT
  34. DECLARE @STATUS VARCHAR(20)
  35. DECLARE @flag INT
  36. SET @x=1
  37. SET @flag=0
  38. while @x<=(SELECT COUNT(*) FROM #temp)
  39. BEGIN
  40.  
  41. IF ((SELECT estado FROM #temp WHERE rn=@x)='inicio' AND @flag=0)
  42. BEGIN
  43.     SELECT @inicio=fecha FROM #temp WHERE rn=@x
  44.     SET @flag=1
  45. END
  46. IF(SELECT estado FROM #temp WHERE rn=@x)='fin'
  47.     BEGIN
  48.         IF( ((SELECT estado FROM #temp WHERE rn=@x+1)='Inicio') OR (@x=(SELECT COUNT(*) FROM #temp))  )
  49.         BEGIN          
  50.             SELECT @fin=fecha FROM #temp WHERE rn=@x
  51.             SET @horas=datediff(hh,@inicio,@fin)
  52.             INSERT INTO @resultado VALUES (@inicio,@fin,@horas)
  53.             SET @flag=0
  54.         END
  55.     END
  56.  
  57. SET @x=@x+1
  58. END
  59. SELECT * FROM @resultado

Con un query sencillo veo muy complejo que puedas hacer lo que necesitas :P
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 22/10/2013, 11:46
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Consulta SQL resta de 2 fechas en el mismo campo en distinto registro. (co

Los datos:
Código SQL:
Ver original
  1. CREATE TABLE #T(id INT,
  2.                 Fecha DateTime,
  3.                 Estado VARCHAR(10));
  4.  
  5. INSERT INTO #T SELECT 1,'01-01-2013 08:00','inicio';
  6. INSERT INTO #T SELECT 1,'01-01-2013 10:00','fin';
  7. INSERT INTO #T SELECT 1,'01-01-2013 13:00','inicio';
  8. INSERT INTO #T SELECT 1,'01-01-2013 13:30','fin';
  9. INSERT INTO #T SELECT 1,'01-01-2013 13:40','fin';
  10. INSERT INTO #T SELECT 1,'01-01-2013 14:00','inicio';
  11. INSERT INTO #T SELECT 1,'01-01-2013 14:30','inicio';
  12. INSERT INTO #T SELECT 1,'01-01-2013 15:40','fin';

La recuperacion:
Código SQL:
Ver original
  1. WITH T1 AS
  2. (SELECT ROW_NUMBER() OVER(ORDER BY Fecha)-ROW_NUMBER() OVER(Partition BY Estado ORDER BY Fecha) N,
  3.         *
  4. FROM    #T),
  5. T2 AS
  6. (SELECT CASE Estado WHEN 'inicio' THEN N+1 ELSE N END N,
  7.         Estado,
  8.         CASE Estado WHEN 'inicio' THEN MIN(Fecha) ELSE MAX(Fecha) END Fecha
  9. FROM    T1
  10. GROUP BY N,
  11.         Estado)
  12. SELECT  MIN(Fecha) inicio,
  13.         MAX(Fecha) Fin
  14. FROM    T2
  15. GROUP BY N
  16. ORDER BY N;
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #8 (permalink)  
Antiguo 22/10/2013, 11:55
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta SQL resta de 2 fechas en el mismo campo en distinto registro. (co

wow excelente respuesta Geri :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 22/10/2013, 12:00
 
Fecha de Ingreso: junio-2006
Mensajes: 34
Antigüedad: 17 años, 10 meses
Puntos: 1
Respuesta: Consulta SQL resta de 2 fechas en el mismo campo en distinto registro. (co

muchas gracias, las voy a probar y les comentos!! graciasl Mil!
  #10 (permalink)  
Antiguo 22/10/2013, 12:12
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Consulta SQL resta de 2 fechas en el mismo campo en distinto registro. (co

De hecho- mi respuesta no es correcta..
Voy a agregar unas filas mas (02-01-2013 14:30 - 02-01-2013 15:40):
Código SQL:
Ver original
  1. INSERT INTO #T SELECT 1,'02-01-2013 14:00','inicio';
  2. INSERT INTO #T SELECT 1,'02-01-2013 14:30','inicio';
  3. INSERT INTO #T SELECT 1,'02-01-2013 14:40','inicio';
  4. INSERT INTO #T SELECT 1,'02-01-2013 14:50','inicio';
  5. INSERT INTO #T SELECT 1,'02-01-2013 15:30','fin';
  6. INSERT INTO #T SELECT 1,'02-01-2013 15:33','fin';
  7. INSERT INTO #T SELECT 1,'02-01-2013 15:35','fin';
  8. INSERT INTO #T SELECT 1,'02-01-2013 15:40','fin';

y la correcta recuperacion es:
Código SQL:
Ver original
  1. WITH T1 AS
  2. (SELECT ROW_NUMBER() OVER(ORDER BY Fecha)-ROW_NUMBER() OVER(Partition BY Estado ORDER BY Fecha) N,
  3.         *
  4. FROM    #T),
  5. T2 AS
  6. (SELECT N, --Case Estado When 'inicio' Then N+1 Else N End N,
  7.         Estado,
  8.         CASE Estado WHEN 'inicio' THEN MIN(Fecha) ELSE MAX(Fecha) END Fecha
  9. FROM    T1
  10. GROUP BY N,
  11.         Estado),
  12. T3 AS
  13. (SELECT ROW_NUMBER() OVER(Partition BY Estado ORDER BY Fecha) N,
  14.         Estado,
  15.         Fecha
  16. FROM    T2 )
  17. SELECT  MIN(Fecha) inicio,
  18.         MAX(Fecha) Fin
  19. FROM    T3
  20. GROUP BY N
  21. ORDER BY N;

Libras- no debes corregir nada, tu codigo es correcto tambien con este caso extremo.
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #11 (permalink)  
Antiguo 22/10/2013, 17:30
 
Fecha de Ingreso: junio-2006
Mensajes: 34
Antigüedad: 17 años, 10 meses
Puntos: 1
Respuesta: Consulta SQL resta de 2 fechas en el mismo campo en distinto registro. (co

muchas gracias a ambos!!! me faltan palabras para agradecer la desinteresada ayuda... solo me salta una duda... si el primer registro es "fin" debería pasar al próximo.. en el ejemplo de GeriReshef lo toma como el primero.. intente arreglarlo pero no pude.. me ayudan??
  #12 (permalink)  
Antiguo 22/10/2013, 21:39
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta SQL resta de 2 fechas en el mismo campo en distinto registro. (co

en mi ejemplo aunque el primer registro sea fin toma el primer inicio ;)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #13 (permalink)  
Antiguo 23/10/2013, 01:05
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Consulta SQL resta de 2 fechas en el mismo campo en distinto registro. (co

Se pone más y más complicado..
Supongo que en tal casos debemos omitir los 'fin' en el principio y los 'inicio' en el fin.
Te adjunto toda la solución con todos los datos:
Código SQL:
Ver original
  1. IF Object_ID('tempdb..#T','U') IS NOT NULL DROP TABLE #T;
  2.  
  3. CREATE TABLE #T(id INT,
  4.                 Fecha DateTime,
  5.                 Estado VARCHAR(10));
  6.  
  7. INSERT INTO #T SELECT 1,'01-01-2013 01:00','fin';
  8. INSERT INTO #T SELECT 1,'01-01-2013 02:00','fin';
  9. INSERT INTO #T SELECT 1,'01-01-2013 03:00','fin';
  10.  
  11. INSERT INTO #T SELECT 1,'01-01-2013 08:00','inicio';
  12. INSERT INTO #T SELECT 1,'01-01-2013 10:00','fin';
  13. INSERT INTO #T SELECT 1,'01-01-2013 13:00','inicio';
  14. INSERT INTO #T SELECT 1,'01-01-2013 13:30','fin';
  15. INSERT INTO #T SELECT 1,'01-01-2013 13:40','fin';
  16. INSERT INTO #T SELECT 1,'01-01-2013 14:00','inicio';
  17. INSERT INTO #T SELECT 1,'01-01-2013 14:30','inicio';
  18. INSERT INTO #T SELECT 1,'01-01-2013 15:40','fin';
  19.  
  20. INSERT INTO #T SELECT 1,'02-01-2013 14:00','inicio';
  21. INSERT INTO #T SELECT 1,'02-01-2013 14:30','inicio';
  22. INSERT INTO #T SELECT 1,'02-01-2013 14:40','inicio';
  23. INSERT INTO #T SELECT 1,'02-01-2013 14:50','inicio';
  24. INSERT INTO #T SELECT 1,'02-01-2013 15:30','fin';
  25. INSERT INTO #T SELECT 1,'02-01-2013 15:33','fin';
  26. INSERT INTO #T SELECT 1,'02-01-2013 15:35','fin';
  27. INSERT INTO #T SELECT 1,'02-01-2013 15:40','fin';
  28.  
  29.  
  30. INSERT INTO #T SELECT 1,'02-01-2013 23:00','inicio';
  31. INSERT INTO #T SELECT 1,'02-01-2013 23:10','inicio';
  32. INSERT INTO #T SELECT 1,'02-01-2013 23:20','inicio';
  33.  
  34. WITH T1 AS
  35. (SELECT ROW_NUMBER() OVER(ORDER BY Fecha)-ROW_NUMBER() OVER(Partition BY Estado ORDER BY Fecha) N,
  36.         *
  37. FROM    #T),
  38. T2 AS
  39. (SELECT N,
  40.         Estado,
  41.         CASE Estado WHEN 'inicio' THEN MIN(Fecha) ELSE MAX(Fecha) END Fecha,
  42.         MIN(N) OVER() MinN,
  43.         MAX(N) OVER() MaxN
  44. FROM    T1
  45. GROUP BY N,
  46.         Estado),
  47. T3 AS
  48. (SELECT ROW_NUMBER() OVER(Partition BY Estado ORDER BY Fecha) N,
  49.         Estado,
  50.         Fecha
  51. FROM    T2
  52. WHERE   NOT (N=MinN AND Estado='fin')
  53.         AND NOT (N=MaxN AND Estado='inicio'))
  54. SELECT  MIN(Fecha) inicio,
  55.         MAX(Fecha) Fin
  56. FROM    T3
  57. GROUP BY N
  58. ORDER BY N;
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #14 (permalink)  
Antiguo 23/10/2013, 06:16
 
Fecha de Ingreso: junio-2006
Mensajes: 34
Antigüedad: 17 años, 10 meses
Puntos: 1
Respuesta: Consulta SQL resta de 2 fechas en el mismo campo en distinto registro. (co

mucha gracias a ambos! realmente se pasaron..
Libras en realidad si me percate que tu consulta no considera si fin era al principio, pero me complicaba porque le asignas un indice a la tabla, y en mi tabla de producción actual no la tengo.. no supe como solucionar eso.. pero agradezco igualmente..

GeriReshef -> muchas gracias nuevamente..

Estas consultas no creo que tenga problema para correrla en una conexión php + odbc de sqlserver cierto..
  #15 (permalink)  
Antiguo 23/10/2013, 08:06
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta SQL resta de 2 fechas en el mismo campo en distinto registro. (co

para asignar el id en una tabla que tienes en produccion puedes hacer lo siguiente:


Código SQL:
Ver original
  1. SELECT *,IDENTITY(INT,1,1) AS rn INTO #temp FROM tabla
  2.  
  3. SELECT * FROM #temp

prueba con ese query y obtienes los datos con un numerico consecutivo :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #16 (permalink)  
Antiguo 23/10/2013, 08:40
 
Fecha de Ingreso: junio-2006
Mensajes: 34
Antigüedad: 17 años, 10 meses
Puntos: 1
Respuesta: Consulta SQL resta de 2 fechas en el mismo campo en distinto registro. (co

Estupendo Libras.. muchas gracias.
  #17 (permalink)  
Antiguo 25/10/2013, 11:57
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Consulta SQL resta de 2 fechas en el mismo campo en distinto registro. (co

Mariolos- recibi tu mensaje, pero no puedo contestar.
Cita:
Editado: Violacion a la Política de uso de Foros del Web 2.3
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog

Última edición por gnzsoloyo; 26/10/2013 a las 21:40
  #18 (permalink)  
Antiguo 26/10/2013, 19:52
 
Fecha de Ingreso: junio-2006
Mensajes: 34
Antigüedad: 17 años, 10 meses
Puntos: 1
Respuesta: Consulta SQL resta de 2 fechas en el mismo campo en distinto registro. (co

gracias te lo envió enseguida!

Etiquetas: campo, condición, distinto, fecha, registro, resta, sql, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:59.