none
Calcular Duración de Ingreso de un Registro RRS feed

  • Pregunta

  • Hola a todos!!

    Tengo una tabla donde tengo n registros, estoy creando un trigger para que cuando actualice un registro me capture la hora inicial y la hora final luego de esto me indique el tiempo de duración, esto es lo que llevo

    Create trigger Tiempo_Duracion
    ON tablavistias
    After Update
    as
    Begin
    Insert Into Tblog (Descripcion, HoraInicio, HoraFinal,Duracion)
    values ('Tiempo Duracion',SYSDATETIME(), SYSDATETIME(),GETDATE()) 

    End

    Esto lo guardo en otra tabla (Tblog), pero me captura siempre la fecha de hora, si alguien me puede ayudar les agradezco 

    Slds,


    Daniel Valero

    domingo, 18 de septiembre de 2016 18:28

Respuestas

  • Con un trigger no vas a poder. El trigger siempre se dispara después de haber realizado la inserción, por lo que solo puedes saber la hora a la que terminó, no la hora a la que empezó.

    Podrías poner un trigger INSTEAD OF en lugar del trigger AFTER, y dentro guardar la hora de inicio, después hacer la inserción (que de lo contrario no tiene lugar por ser un INSTEAD OF) y después la hora final. Pero será un poco absurdo, porque quedará complejo, será poco eficiente, y además será inexacto porque las grabaciones en Tblog distorsionarán el tiempo que realmente tomó la auténtica inserción real.

    En lugar de usar un trigger, te propongo usar una Traza. Primero pruébalo a mano usando el Profiler: Haz una captura y fíjate en las columnas que puedes capturar. Verás que hay columnas para la duración medida en ciclos de CPU y también medida en duración real (las cuales no tienen por qué coincidir porque el sistema puede paralelizar una sentencia sobre varias CPUs y/o puede procesar varias sentencias a la vez en una misma CPU). Una vez que compruebes que esa traza está capturando las columnas que quieres, la puedes exportar desde el Profiler y convertirla en una traza de sistema, que rodará por sí sola sin que tengas el Profiler abierto. Después, si lo deseas, hay una vista de sistema que es capaz de mostrarte esas trazas como si fueran una tabla, con lo que las puedes explotar en la misma manera en la que tuvieses previsto explotar tu tabla tblog, pero con un "overhead" muchísimo menor que el de los triggers.

    domingo, 18 de septiembre de 2016 19:16

Todas las respuestas

  • Con un trigger no vas a poder. El trigger siempre se dispara después de haber realizado la inserción, por lo que solo puedes saber la hora a la que terminó, no la hora a la que empezó.

    Podrías poner un trigger INSTEAD OF en lugar del trigger AFTER, y dentro guardar la hora de inicio, después hacer la inserción (que de lo contrario no tiene lugar por ser un INSTEAD OF) y después la hora final. Pero será un poco absurdo, porque quedará complejo, será poco eficiente, y además será inexacto porque las grabaciones en Tblog distorsionarán el tiempo que realmente tomó la auténtica inserción real.

    En lugar de usar un trigger, te propongo usar una Traza. Primero pruébalo a mano usando el Profiler: Haz una captura y fíjate en las columnas que puedes capturar. Verás que hay columnas para la duración medida en ciclos de CPU y también medida en duración real (las cuales no tienen por qué coincidir porque el sistema puede paralelizar una sentencia sobre varias CPUs y/o puede procesar varias sentencias a la vez en una misma CPU). Una vez que compruebes que esa traza está capturando las columnas que quieres, la puedes exportar desde el Profiler y convertirla en una traza de sistema, que rodará por sí sola sin que tengas el Profiler abierto. Después, si lo deseas, hay una vista de sistema que es capaz de mostrarte esas trazas como si fueran una tabla, con lo que las puedes explotar en la misma manera en la que tuvieses previsto explotar tu tabla tblog, pero con un "overhead" muchísimo menor que el de los triggers.

    domingo, 18 de septiembre de 2016 19:16
  • AlejandroSDeveloper,

    Los valores de la operación de inserción que muestras no calculan un intervalo real entre el inicio y fin de la operación, de hecho el desencadenador que implementas es uno del tipo 'AFTER' que se ejecuta posterior a que la transacción fue escrita en la base de datos, por tanto desconoces el momento en que se inició la operación de inserción.

    Tendrías que comentar con claridad cuál es el intervalo de tiempo que deseas obtener, ¿el tiempo desde que la aplicación ordena la inserción hasta que se escribe? o ¿el tiempo que dura la operación de escritura?. De ser el primer caso quizá sirva que tu aplicación envíe como valor una instancia de tiempo el cuál podrías comparar contra el momento en que la operación fue escrita.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 18 de septiembre de 2016 19:32
  • Hola!

    en la tabla "tablavisitas" tengo registros, cuando estoy actualizando alguno de ellos el trigger se lanza y me muestra la hora en la cual inicie y la hora en la cual finalice la edición, luego resto la horas para saber cuantos minutos o segundos se tardo la modificación.

    algo así

    horainicio                 

    07:55:00.0000000

    HoraFinal

    09:00:00.0000000

    Duracion

    65


    Daniel Valero

    domingo, 18 de septiembre de 2016 22:34
  • Hola!,

    Como podría calcular la duración si le agrego un campo de hora inicio en la tabla "tablavisitas", me explico, este campo lo agrego yo, por ejemplo 

    horainicio                 

    07:55:00.0000000

    la hora final que sea por Getupdate() y la duración por la resta,

    Slds,


    Daniel Valero

    domingo, 18 de septiembre de 2016 22:45
  • Saludos

    Aqui estan unas opciones de como hacerlo, no se en que lugar quieres ver este resultado pero aqui viene la mayoría de las maneras que tambien conosco de hacerlo, toma en cuenta que esto causa un overheat en tu consulta al igual que lo haria un trigger.

    http://stackoverflow.com/questions/8247587/sql-server-management-studio-how-to-get-execution-time-down-to-milliseconds
    lunes, 19 de septiembre de 2016 4:22