none
Como puedo sacar la diferencia de las horas y los minutos de dos campos datetime?

    Question

  • Saludos Colegas

    Tengo un pequeño problemita espero que me puedan ayudar como otras veces.

    Tengo que realizar un query que me muestre:

    Numero de Sesiones

    Tiepo Total

    Promedio sesion

    listo

    Tiene que ser el resultado de la diferencia de horas y minutos de dos campos datetime

    Hora entrada, hora salida

    Sacar el  promedio del numero de sesiones y del tiempo total

     

    De antemano muchas gracias y que estén bien saludos

     

    Wednesday, September 14, 2011 6:37 PM

Answers

  • Para el tema de las fechas puedes tomar como modelo el siguiente código :

    DECLARE @fechafrom datetime
    DECLARE @fechato datetime
    
    DECLARE @hora int
    DECLARE @minuto int
    
    SET @fechafrom='2008-02-23 14:23:10'
    SET @fechato='2008-02-23 18:30:10'
    
    SET @hora=CASE WHEN DATEPART(hh,@fechafrom)-DATEPART(hh,@fechato)<0
              THEN (DATEPART(hh,@fechafrom)-DATEPART(hh,@fechato)) * -1
              ELSE
              DATEPART(hh,@fechafrom)-DATEPART(hh,@fechato)
              END
    
    
    SET @minuto=CASE WHEN DATEPART(mi,@fechafrom)-DATEPART(mi,@fechato)<0
              THEN (DATEPART(mi,@fechafrom)-DATEPART(mi,@fechato)) * -1
              ELSE
              DATEPART(mi,@fechafrom)-DATEPART(mi,@fechato)
              END
    
    SELECT CAST (@hora AS nvarchar(25)) + ' horas ' + CAST (@minuto AS nvarchar(25)) + ' minutos '
    
    

    Si requieres especificar unicamente las horas y los minutos puedes descartar aquello que no necesites.  No posteas la estructura de datos, por la consulta que realizas puedes utilizar las funciones de agregación AVG (promedio), y para obtener los tiempos transcurridos puedes hacer una diferencia entre el tiempo menor y el tiempo mayor de tu tabla.  Cualquier duda con gusto te apoyamos. 

     


    "El talento es una disciplina tenaz y una larga paciencia"  Gustave Flaubert

     Email: info@geohernandez.com Blog: geeks.ms/blogs/ghernandez



    Wednesday, September 14, 2011 7:26 PM
  • La forma de hacerlo es calculando la diferencia en segundos entre los dos valores, y luego convertir ese valor a horas dividiendo por 3600 (60 min * 60 sec), y el resto de la division que son los sgundos restantes, dividirlos por 60.

    SELECT
    	DATEDIFF([second], @fechafrom, @fechato) / 3600 AS horas,
    	(DATEDIFF([second], @fechafrom, @fechato) % 3600) / 60 AS minutos;
    

     


    AMB

    Some guidelines for posting questions...

    • Marked as answer by elmarros Monday, September 19, 2011 9:08 PM
    Monday, September 19, 2011 6:59 PM
  • No te preocupes, solo que necesito que me proporciones los rangos de fecha en que se ha presentando ese problema que mencionas, ya que no me parece que el código genere resultados como el que mencionas (6 horas y 80 minutos).

    En casos como este siempe te recomiendo abrir un nuevo post, ya que será mas fácil identificar tu solicitud de apoyo con un nuevo posts que en uno que ya fue contestado. Saludos.


    "El talento es una disciplina tenaz y una larga paciencia"  Gustave FlaubertEmail: info@geohernandez.com Blog: geeks.ms/blogs/ghernandez
    • Marked as answer by elmarros Tuesday, September 20, 2011 7:29 PM
    Monday, September 19, 2011 7:01 PM
  • Te sugiero que postees la estructura de la tabla, data de ejemplo en forma de sentencias "insert", asi como el resultado esperado. De esa forma no tendremo que adivinar los nombres de columnas, ni los tipos de dato, y mucho menor perder nuestro tiempo simulando tu ambiente.

    Algo asi como:

     

    declare @T table (
     sesion_id int not null primary key,
     hora_comienzo datetime not null,
     hora_final datetime not null,
     check (hora_comienzo <= hora_final),
     check (dateadd([day], datediff([day], '19000101', hora_comienzo), '19000101') = dateadd([day], datediff([day], '19000101', hora_final), '19000101'))
     );
    
    insert into @T(sesion_id, hora_comienzo, hora_final) values(1, '2011-09-01T09:00:00', '2011-09-01T09:35:00');
    insert into @T(sesion_id, hora_comienzo, hora_final) values(2, '2011-09-01T10:00:00', '2011-09-01T10:45:00');
    insert into @T(sesion_id, hora_comienzo, hora_final) values(101, '2011-09-15T09:00:00', '2011-09-15T09:45:00');
     
    with rs as (
     select
         dateadd([day], datediff([day], '19000101', hora_comienzo), '19000101') as dia,
         count(*) as sesiones,
         sum(datediff([second], hora_comienzo, hora_final)) as total_seg
     from
         @T
     group by
         dateadd([day], datediff([day], '19000101', hora_comienzo), '19000101')
     )
     select
         dia,
         sesiones,
         total_seg / 3600 as horas,
         (total_seg % 3600) / 60 as minutos,
         (total_seg / sesiones) / 3600 as horas_prom,
         ((total_seg / sesiones) % 3600) / 60 as minutos_prom
     from
         rs;
    go


    Es de notar que en el ejemplo se chequea que la hora de comienzo y fin de cada sesion sea dentro del mismo dia.

     

     


    AMB

    Some guidelines for posting questions...



    • Edited by HunchbackMVP Tuesday, September 20, 2011 12:24 AM
    • Marked as answer by elmarros Tuesday, September 20, 2011 7:29 PM
    Tuesday, September 20, 2011 12:11 AM

All replies

  • Para el tema de las fechas puedes tomar como modelo el siguiente código :

    DECLARE @fechafrom datetime
    DECLARE @fechato datetime
    
    DECLARE @hora int
    DECLARE @minuto int
    
    SET @fechafrom='2008-02-23 14:23:10'
    SET @fechato='2008-02-23 18:30:10'
    
    SET @hora=CASE WHEN DATEPART(hh,@fechafrom)-DATEPART(hh,@fechato)<0
              THEN (DATEPART(hh,@fechafrom)-DATEPART(hh,@fechato)) * -1
              ELSE
              DATEPART(hh,@fechafrom)-DATEPART(hh,@fechato)
              END
    
    
    SET @minuto=CASE WHEN DATEPART(mi,@fechafrom)-DATEPART(mi,@fechato)<0
              THEN (DATEPART(mi,@fechafrom)-DATEPART(mi,@fechato)) * -1
              ELSE
              DATEPART(mi,@fechafrom)-DATEPART(mi,@fechato)
              END
    
    SELECT CAST (@hora AS nvarchar(25)) + ' horas ' + CAST (@minuto AS nvarchar(25)) + ' minutos '
    
    

    Si requieres especificar unicamente las horas y los minutos puedes descartar aquello que no necesites.  No posteas la estructura de datos, por la consulta que realizas puedes utilizar las funciones de agregación AVG (promedio), y para obtener los tiempos transcurridos puedes hacer una diferencia entre el tiempo menor y el tiempo mayor de tu tabla.  Cualquier duda con gusto te apoyamos. 

     


    "El talento es una disciplina tenaz y una larga paciencia"  Gustave Flaubert

     Email: info@geohernandez.com Blog: geeks.ms/blogs/ghernandez



    Wednesday, September 14, 2011 7:26 PM
  • Saludos Geovanny de ante manomcuhas gracias por tu informacion me esta ayudando mucho

     

    tengo una preguta

    por ejemplo ya que le asigne las fechas a las fechas (fechafrom) y (fechato) hay rango en lo que me los marca bien por ejemplo 5 horas 30 minutos por ejemplo pero hay rangos donde me dice

     6 horas 80 minutos

    y no quiero que me quede asi si no que en vez de que salga eso quiero que salga

    7horas 20 minutos

     y eso es lo que estoy tratando de intentar responde hasta ahorita porque estaba haciendo pruebas pero no me salio.

     

    Me gustaria pedirte tu ayuda nuevamente de antemano muchas gracias y que estes bien


    • Edited by elmarros Monday, September 19, 2011 6:30 PM
    Monday, September 19, 2011 6:28 PM
  • La forma de hacerlo es calculando la diferencia en segundos entre los dos valores, y luego convertir ese valor a horas dividiendo por 3600 (60 min * 60 sec), y el resto de la division que son los sgundos restantes, dividirlos por 60.

    SELECT
    	DATEDIFF([second], @fechafrom, @fechato) / 3600 AS horas,
    	(DATEDIFF([second], @fechafrom, @fechato) % 3600) / 60 AS minutos;
    

     


    AMB

    Some guidelines for posting questions...

    • Marked as answer by elmarros Monday, September 19, 2011 9:08 PM
    Monday, September 19, 2011 6:59 PM
  • No te preocupes, solo que necesito que me proporciones los rangos de fecha en que se ha presentando ese problema que mencionas, ya que no me parece que el código genere resultados como el que mencionas (6 horas y 80 minutos).

    En casos como este siempe te recomiendo abrir un nuevo post, ya que será mas fácil identificar tu solicitud de apoyo con un nuevo posts que en uno que ya fue contestado. Saludos.


    "El talento es una disciplina tenaz y una larga paciencia"  Gustave FlaubertEmail: info@geohernandez.com Blog: geeks.ms/blogs/ghernandez
    • Marked as answer by elmarros Tuesday, September 20, 2011 7:29 PM
    Monday, September 19, 2011 7:01 PM
  • Saludos nuevamente y muchas gracias por su ayuda.

    Con el aporte de Hunchback pude salir del problema ahora lo que trato de hacer es de que me muestre el resultado de por ejemplo de 30 dias.

    Asi como lo tengo me sale un reultado asi  desde las fechas 01/09/2011 al 15/09/2011

    de esta manera tambien lo requiero pero esto ya me quedo solo falta el del promedio

    totalSesiones

    Tiempo total

    1726

    50:49

     

    y de estamanera me falta

     Como puedo hacerle para que muestre los resultados por dia y en vez de que me saque solo un resultado me saque todos

    Monday, September 19, 2011 9:22 PM
  • Te sugiero que postees la estructura de la tabla, data de ejemplo en forma de sentencias "insert", asi como el resultado esperado. De esa forma no tendremo que adivinar los nombres de columnas, ni los tipos de dato, y mucho menor perder nuestro tiempo simulando tu ambiente.

    Algo asi como:

     

    declare @T table (
     sesion_id int not null primary key,
     hora_comienzo datetime not null,
     hora_final datetime not null,
     check (hora_comienzo <= hora_final),
     check (dateadd([day], datediff([day], '19000101', hora_comienzo), '19000101') = dateadd([day], datediff([day], '19000101', hora_final), '19000101'))
     );
    
    insert into @T(sesion_id, hora_comienzo, hora_final) values(1, '2011-09-01T09:00:00', '2011-09-01T09:35:00');
    insert into @T(sesion_id, hora_comienzo, hora_final) values(2, '2011-09-01T10:00:00', '2011-09-01T10:45:00');
    insert into @T(sesion_id, hora_comienzo, hora_final) values(101, '2011-09-15T09:00:00', '2011-09-15T09:45:00');
     
    with rs as (
     select
         dateadd([day], datediff([day], '19000101', hora_comienzo), '19000101') as dia,
         count(*) as sesiones,
         sum(datediff([second], hora_comienzo, hora_final)) as total_seg
     from
         @T
     group by
         dateadd([day], datediff([day], '19000101', hora_comienzo), '19000101')
     )
     select
         dia,
         sesiones,
         total_seg / 3600 as horas,
         (total_seg % 3600) / 60 as minutos,
         (total_seg / sesiones) / 3600 as horas_prom,
         ((total_seg / sesiones) % 3600) / 60 as minutos_prom
     from
         rs;
    go


    Es de notar que en el ejemplo se chequea que la hora de comienzo y fin de cada sesion sea dentro del mismo dia.

     

     


    AMB

    Some guidelines for posting questions...



    • Edited by HunchbackMVP Tuesday, September 20, 2011 12:24 AM
    • Marked as answer by elmarros Tuesday, September 20, 2011 7:29 PM
    Tuesday, September 20, 2011 12:11 AM
  • abrire otro nuevo post para aclarar lo del promedio saludos y gracias por la ayuda

    Tuesday, September 20, 2011 7:29 PM