none
REGISTRAR DATOS QUE NO SE HAN REGISTRADO

    Pregunta

  •               StartDate                             EndTime                     

    2012-07-12 00:01:13.000 2012-07-12 00:01:54.000
    2012-07-12 00:01:54.000    2012-07-12 00:01:54.000
    2012-07-12 00:12:56.000  2012-07-12 00:14:59.000

    la fecha final del campo EndTime es la del comienzo del StartDate, es decir que esta encedido x vehiculo

    cuando no, quiere decir que esta apagado

    Como puedo registrar la diferencia de los datos que están en subrayado, quedando asì

    2012-07-12 00:01:54.000       2012-07-12 00:12:56.000


    • Editado Dasa0001 martes, 31 de julio de 2012 21:26
    martes, 31 de julio de 2012 19:30

Respuestas

  • Intenta eso:

    Create Table #T (Id Int, Lugar Char(1), StartDate DateTime, StartEnd DateTime);
    
    Insert Into #T Select 3335,'X','2012-07-12 00:00:31.000','2012-07-12 00:00:47.000';
    Insert Into #T Select 3335,'X','2012-07-12 00:00:47.000','2012-07-12 00:01:13.000';
    Insert Into #T Select 3335,'X','2012-07-12 00:01:54.000','2012-07-12 00:02:52.000';
    
    With T1 As
    (Select Id, Lugar, StartDate Tiempo
    From	#T
    Union 
    Select Id, Lugar, StartEnd
    From	#T),
    T2 As
    (Select	Row_Number() Over(Partition By Id, Lugar Order By Tiempo) N,
    		*
    From	T1)
    Select	T2_1.*,
    		T2_2.Tiempo StartEnd
    From T2 T2_1
    Inner Join T2 T2_2
    		On T2_1.id=T2_2.id
    		And T2_1.lugar=T2_2.lugar
    		And T2_1.N=T2_2.N-1;


    Blog: http://about.me/GeriReshef

    • Marcado como respuesta Dasa0001 miércoles, 01 de agosto de 2012 19:47
    miércoles, 01 de agosto de 2012 19:30

Todas las respuestas

  • No entiendo la pregunta.

    TripCarDaily cual tabla es ?

    Cual es la diferencia entre tu tabla 1 yla que obtienes con cursores anidados ?

    Que datos contiene carros ?

    Creo que faltan datos para que alguien externo entienda que quieres. Parece una pregunta trivial. Personalmente pienso que tienes 2 preguntas mezcladas en vez de 1.


    MVP MCT MCTS Daniel Calbimonte

    http://elpaladintecnologico.blogspot.com

    martes, 31 de julio de 2012 19:57
  • StartDate                                                 

    2012-07-12 00:01:13.000          2012-07-12 00:01:54.000
    2012-07-12 00:01:54.000  

     EndTime       2012-07-12 00:01:54.000
    2012-07-12 00:12:56.000  2012-07-12 00:14:59.000

    la fecha final del campo EndTime es la del comienzo del StartDate, es decir que esta encedido x vehiculo

    cuando no, quiere decir que esta apagado

    Como puedo registrar la diferencia de los datos que están en subrayado, quedando asì

    2012-07-12 00:01:54.000       2012-07-12 00:12:56.000


    • Editado Dasa0001 martes, 31 de julio de 2012 21:29
    martes, 31 de julio de 2012 21:28
  • Hola.

    No queda claro si quieres conocer la diferencia entre dos campos EndTime o entre un EndTime y el StartTime posterior. En cualquier caso se puede lograr de un modo muy similiar, empleando row_number para asignarle un número a cada registros y luego cruzándolo con sigo mismo, o bien, y mucho más fácil, empleando las funciones lag o lead, aunque esto sólo es para SQL Server 2012. Con esto segundo es algo trivial, ya que te da acceso al registro anterior o siguiente a nivel de fila, mira la ayuda y emplea la función (http://msdn.microsoft.com/es-es/library/hh231256.aspx). De la forma, digamos clásica, sería más o menos así:

    ;with cte as (Select num = row_number() over (order by StartDate), startdate, enddate
    from Tabla)
    
    select c1.startdate, c1.enddate, diferencia_en_minutos = datediff(mn, c1.startdate, c2.enddate)
    from 
      cte c1 left join 
      cte c2 on c1.num = c2.num + 1 --> el registro anterior
    

    Si no lo logras, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    miércoles, 01 de agosto de 2012 8:39
    Moderador
  • Intenta eso:

    Create Table #T (Id Int, Lugar Char(1), StartDate DateTime, StartEnd DateTime);
    
    Insert Into #T Select 3335,'X','2012-07-12 00:00:31.000','2012-07-12 00:00:47.000';
    Insert Into #T Select 3335,'X','2012-07-12 00:00:47.000','2012-07-12 00:01:13.000';
    Insert Into #T Select 3335,'X','2012-07-12 00:01:54.000','2012-07-12 00:02:52.000';
    
    With T1 As
    (Select Id, Lugar, StartDate Tiempo
    From	#T
    Union 
    Select Id, Lugar, StartEnd
    From	#T),
    T2 As
    (Select	Row_Number() Over(Partition By Id, Lugar Order By Tiempo) N,
    		*
    From	T1)
    Select	T2_1.*,
    		T2_2.Tiempo StartEnd
    From T2 T2_1
    Inner Join T2 T2_2
    		On T2_1.id=T2_2.id
    		And T2_1.lugar=T2_2.lugar
    		And T2_1.N=T2_2.N-1;


    Blog: http://about.me/GeriReshef

    • Marcado como respuesta Dasa0001 miércoles, 01 de agosto de 2012 19:47
    miércoles, 01 de agosto de 2012 19:30
  • Buenos días Ingeniero Geri_Reshef, que pena contigo, tú me podrías explicar esta líneas de código, nunca había visto algo así, me funciono, entendí que creaste una tabla temporal e investigue  lo del ROW_NUMBER, pero por fa me puedes explicar con un gráfico como es que se llega al resultado, te lo agradecería. Éxitos

    Ahora bien le cambie el carro e hice esto

    DECLARE @EJEMPLO TABLE (Id Int, Lugar Char(1), StartDate DateTime, StartEnd DateTime)

    Insert Into @EJEMPLO Select 3335,'X','2012-07-12 00:00:31.000','2012-07-12 00:00:47.000';
    Insert Into @EJEMPLO Select 3335,'A','2012-07-12 00:00:47.000','2012-07-12 00:01:13.000';
    Insert Into @EJEMPLO Select 3335,'X','2012-07-12 00:01:54.000','2012-07-12 00:02:52.000';
    Insert Into @EJEMPLO Select 3335,'X','2012-07-12 00:03:54.000','2012-07-12 00:04:52.000';

    --SELECT * FROM @EJEMPLO

    WITH TABLA1 AS
    (
    SELECT Id, Lugar, StartDate AS FechaInicio FROM @EJEMPLO
    UNION 
    SELECT Id, Lugar, StartEnd AS FechaFin FROM @EJEMPLO
    --ORDER BY FechaInicio
    ), TABLA2  AS

    (SELECT  ROW_NUMBER() OVER(PARTITION BY Id, Lugar ORDER BY FechaInicio)AS Row,* FROM TABLA1)

    SELECT TABLA2_1.*, TABLA2_2.FechaInicio FechaFin
    FROM TABLA2 TABLA2_1
    INNER JOIN TABLA2 TABLA2_2
    ON TABLA2_1.Id = TABLA2_2.Id
    AND TABLA2_1.Lugar = TABLA2_2.Lugar
    AND TABLA2_1.Row=TABLA2_2.Row-1
    ORDER BY FechaInicio, FechaFin

    Y me retorna los siguiente

    El resultado cambia, me podrías ayudar gracias

    • Editado Dasa0001 jueves, 02 de agosto de 2012 15:15
    jueves, 02 de agosto de 2012 13:22
  • Moderador tu sabes como puedo hacer los siguiente, contar los lugares de esta consulta

     Para que quede así

    id Lugar Start Date End Date (Sin nombre de columna)
    3335 X 2012-07-12 00:00:31.000 2012-07-12 00:04:52.000 2
    3335 A 2012-07-12 00:00:47.000 2012-07-12 00:01:54.000 1

    Teniendo en cuenta que el lugar X tiene una fecha de inicio distinta a la anterior, es decir que cuando cuando el carro x esta es en

    el mismo lugar hace una visita, luego se dirige al lugar A, esta es 1 visita para A, pero si se vuelve a dirigir a X se suma la visita.

    Gracias

    miércoles, 08 de agosto de 2012 15:03
  • Gerif tu sabes como puedo hacer esto a la consulta que me ayudaste.

    ¿Cómo puedo hacer una consulta para no contar registros que están de manera consecutiva?

    Ejemplo

    Código   Lugar

      1          Bog

      1          Bog

      1          Cuc

      1          Bog

      1          Cuc

    Es decir si hago un count, me retorna lo siguiente

    Bog 3

    Cuc 2

    Cómo haría para que teniendo en cuenta el lugar consecutivo me lo cuente solo una vez quedando así

    Bog 2

    Cuc 2.

    Gracias.

    jueves, 09 de agosto de 2012 13:39