Quiero restar 2 fechas y representar el resultado en horas y minutos en una sola cifra decimal.

Tengo la siguiente tabla y lo que estoy haciendo de esta manera, pero el resultado no es como se desee.

Hay alguna ligera variación, estoy seguro de que este es aritmética simple pero no lo estoy haciendo bien.

select start_time, end_time, (end_time-start_time)*24 from 
come_leav;    
 
START_TIME END_TIME (END_TIME-START_TIME)*24 
------------------- ------------------- ------------------------ 
21-06-2011 14:00:00 21-06-2011 16:55:00 2.9166667 
21-06-2011 07:00:00 21-06-2011 16:50:00 9.8333333 
21-06-2011 07:20:00 21-06-2011 16:30:00 9.1666667 

Quiero que el resultado (end_time-start_time) como a continuación.

16:55- 14:00 = 2.55 
16:50-07:00 = 9.5 
16:30-7:20 = 9.1 y así sucesivamente. 

¿Cómo puedo hacer eso?

Resultado esperado se ve bastante ridículo. Debe ser como esto. 16:55- 14:00 = 2:55 o 2.92 16:50-07:00 = 9:50 o 9.83 16:30-7:20 = 9:10 o 9.17
voy a ser capaz de ponerse en la forma de 2.55. De hecho, estoy de informes de tiempo y fuera de tiempo y calcular la diferencia en horas y minutos. gracias.
He de decir, este es probablemente uno de los más bien escrito SQL preguntas que he visto en Stack Overflow. Sé que probablemente ya te has olvidado de esto, pero tenía que decirlo.

OriginalEl autor Macky | 2011-09-18

8 Comentarios

  1. 4
    SQL> edit
    Wrote file afiedt.buf
    
      1  select start_date
      2      , end_date
      3      , (24 * extract(day from (end_date - start_date) day(9) to second))
      4          + extract(hour from (end_date - start_date) day(9) to second)
      5          + ((1/100) * extract(minute from (end_date - start_date) day(9) to second)) as "HOUR.MINUTE"
      6* from t
    SQL> /
    
    START_DATE          END_DATE            HOUR.MINUTE
    ------------------- ------------------- -----------
    21-06-2011 14:00:00 21-06-2011 16:55:00        2.55
    21-06-2011 07:00:00 21-06-2011 16:50:00         9.5
    21-06-2011 07:20:00 21-06-2011 16:30:00         9.1

    Cabe señalar que para los que vienen a través de este código, que el decimal porciones son REALES minutos diferencias, y no parte de una hora. .5, por lo tanto, representa 50 minutes, no 30 minutes.

    A continuación es el resultado al ejecutar este. Pero pls echar un vistazo a la última línea me da 7.1 en caso de que como yo necesito 7,5 (14-6.50) sin jeoparizing otras figuras. Agradezco su ayuda START_TIME END_TIME HORA.MINUTOS ——————- ——————- —- 21-06-2011 14:00:00 21-06-2011 16:55:00 2.55 21-06-2011 07:00:00 21-06-2011 16:50:00 9.5 21-06-2011 07:20:00 21-06-2011 16:30:00 9.1 22-06-2011 07:20:00 22-06-2011 16:30:00 9.1 23-06-2011 07:20:00 23-06-2011 16:30:00 9.1 21-06-2011 06:50:00 21-06-2011 14:00:00 7.1
    Que no tiene ningún sentido. Usted lo pidió para la resta de tiempo que podría resultar en hours.minutes. (Que no tiene mucho sentido empezar con.) 14:00 menos las 6:50 de siete horas diez minutos o 7.1. Estás diciendo que quieres 2:00 – 1:59 a ser 0.41 por un minuto y de 1:41 – 1:00 para ser 0.41 por cuarenta y un minutos?
    Gran trabajo de descifrar lo que quería y el código de arriba. Como una nota en el código en el post, porque de la OP impar requisito, se debe destacar el decimal de la muestra real en minutos, no en fracciones de una hora. He presentado una edición.

    OriginalEl autor Shannon Severance

  2. 2

    Probar este

    round(to_number(end_time - start_time) * 24)
    Gracias por tu ayuda. Pero el resultado no es lo que yo quería. Vea a continuación SQL> seleccione to_number(end_time-start_time)*24 de come_leav; TO_NUMBER(END_TIME-START_TIME)*24 ——————————— 2.9166667 9.8333333 9.1666667 9.1666667 9.1666667 7.1666667
    No tengo una base de datos de oracle instalado, por lo tanto no podía verificarse la consulta me dio. Lo siento por la incorrecta/incompleta respuesta.
    Es precisa en el sentido de que proporciona el equivalente decimal de minutos, sólo tienes que multiplicar esa parte por 60. El problema es el raro requisito donde el OP necesario como HH.MM.
    FLOOR((end_time - start_time) * 24) || '.' || ROUND(((end_time - start_time) * 24) - FLOOR((end_time - start_time) * 24)*60) es probable cómo el OP tendría que utilizar.

    OriginalEl autor reader_1000

  3. 2

    Oracle representa las fechas como un número de días, así que (end_time-start_time)*24 le da las horas. Supongamos que usted tiene este número (por ejemplo. 2.9166667) en h columna. Entonces usted puede fácilmente convertir al formato que quieras con: FLOOR(h) + (h-FLOOR(h))/100*60.

    Ejemplo:

    WITH diff AS (
        SELECT (TO_DATE('21-06-2011 16:55:00', 'DD-MM-YYYY HH24:MI:SS') - TO_DATE('21-06-2011 14:00:00', 'DD-MM-YYYY HH24:MI:SS'))*24 h
        FROM dual
    ) SELECT FLOOR(h) + (h-FLOOR(h))/100*60
    FROM diff

    En su caso:

    SELECT start_time, end_time,
        FLOOR((end_time-start_time)*24) + ((end_time-start_time)*24-FLOOR((end_time-start_time)*24))/100*60 AS hours_diff
    FROM come_leav 

    OriginalEl autor Crack

  4. 0

    intente esto:

        SELECT
        TRIM(TO_CHAR(TRUNC(((86400*(end_time - start_time))/60)/60)-24*(trunc((((86400*(end_time - start_time))/60)/60)/24)),'00')) ||'.'||
        TRIM(TO_CHAR(TRUNC((86400*(end_time - start_time))/60)-60*(trunc(((86400*(end_time - start_time))/60)/60)),'00')) ||'.'  as duration
    FROM come_leav;
    Gracias por tu ayuda, estoy consiguiendo los resultados deseados, pero no puedo lo tengo sin concatenación, me refiero a que como resultado final, porque tengo que usar esto para calcular la diferencia en tiempo y fuera de tiempo.
    si usted tiene que utilizar para calcular cosas, los resultados en tu post original son correctos. A las 1: 30 es una hora y medio, una mitad es de 0,5, por lo que 1h30 = 1.5 horas.
    Hola roslan, tienes razón, pero quiero que el cálculo se realiza como ya he solicitado b’coz quiero encontrar la diferencia de tiempo entre la hora de inicio y hora de finalización. Así que quiero que el resultado como lo solicita antes que yo.e 16:55-14:00 a 2.55 y no 2.916667. así que por favor avisar de una manera más simple de hacerlo thankx…
    He editado el post… sustituido el : separador con una . y quita los segundos de la cadena.

    OriginalEl autor Kevin Burton

  5. 0

    Edit: si usted necesita un número, entonces

        trunc(end_date-start_date)*24+
        to_number(to_char(trunc(sysdate)+(end_date-start_date),'HH24.MI'))

    Para la cadena de resultado, si delta es MENOS DE 24H:
    Me gustaría ir con

        to_char(trunc(sysdate)+(end_date-start_date),'HH24.MI')

    o ...'HH24:MI:SS', pero eso es mi preferencia personal.

    por más de 24H términos, me gustaría prefijo con

        trunc(end_date-start_date)||"days "||
        to_char(trunc(sysdate)+(end_date-start_date),'HH24.MI')

    Sí, como oracle cuenta en días, con segundos de precisión, que están lidiando con problemas aritméticos. Una vez, ya que sólo están el manejo de minutos (por lo que podría redondear el número a trunc(days*24*60+0.5)/24/60), pero la aritmética binaria imprecisión en el número 1/24/60 todavía podría causar problemas.

    Edit2.1:

        to_char(24*(trunc(end_date)-trunc(start_date))+to_number(to_char(end_date,'HH24.MI'))-to_number(to_char(start_date,'HH24.MI')),'99999.99')

    Pero El resultado podría ser muy confuso para la media, como el decimal 7.50 sugeriría siete horas y media, o al menos de 7 horas 50 minutos, se opuso a que el tiempo transcurrido de 7 horas y 10 minutos.

    seleccione start_time, end_time, to_char(trunc(sysdate)+(end_time-start_time),’HH24.MI’) de come_leav; S_TIME E_TIME T_C 21-06-2011 14:00:00 21-06-2011 16:55:00 02.55 21-06-2011 07:00:00 21-06-2011 16:50:00 09.50 21-06-2011 07:20:00 21-06-2011 16:30:00 09.10 22-06-2011 07:20:00 22-06-2011 16:30:00 09.10 23-06-2011 07:20:00 23-06-2011 16:30:00 09.10 21-06-2011 06:50:00 21-06-2011 14:00:00 07.10. Por favor, eche un vistazo a los últimos resultados (14-06.50) devuelve 07.10 donde como yo lo quiero como (14-06.50) = 7.5. Cualquier sugerencia de cómo superar eso.. un millón de Gracias por tu ayuda.
    a continuación, compruebe la última (edit2) versión
    Esto es lo que me pasa, Parece que se ha solucionado el anterior, pero pls tener una mirada en el primero se da -88.45 en lugar de 2.55. Pls ayuda que necesito para obtener el derecho. .. START_TIME END_TIME ——— ——————- TRUNC(END_TIME-START_TIME)+TO_CHAR(TO_NUMBER(TO_CHAR(END_TIME,’HH24.MI’))-TO_NUMBER(TO_CHAR(START_TI ——————————————————————– 21-09-2011 14:00:00 21-06-2011 16:55:00 -88.45 21-06-2011 07:00:00 21-06-2011 16:50:00 9.5 23-06-2011 07:20:00 23-06-2011 16:30:00 9.1 21-06-2011 06:50:00 21-06-2011 14:00:00 7.5
    Ok, hizo algún error, 2.1 ahora funciona como su voluntad. Pero no podía conseguir 2.55, ya que están en diferentes meses, y el final es menor que la de inicio, por lo que tiene a resultado en un gran número negativo. (Si se quita el 24*(…)+ parte, obtendrá 2.55, pero no se debe)
    Hola @vmatyi, lo Siento. Sí, esa fecha es en un mes diferente. Tiene que ser en el mismo mes o más bien debería decir que será en una misma fecha. Me estoy encontrando la diferencia restando time_out de time_in a obtener en el área de rrhh.min. Esto es para los datos obtenidos de un reloj de tiempo de la máquina que realiza el seguimiento de emp tiempos de entrada y salida, y que informe tot horas y horas de retraso. Estoy haciendo de esta manera. retorno(trunc(:et_time-:st_time)+to_char(to_number(to_char(:et_time, ‘HH24.MI’))-to_number(to_char(:st_time,’HH24.MI’)),’9.99′));

    OriginalEl autor vmatyi

  6. 0

    Esta consulta es muy útil para mí y si cualquier cuerpo desea diferencias entre start_date y end_date con el tiempo como HH:MI:SS por favor, utilice esta consulta.

    SELECT
        TRIM(TO_CHAR(TRUNC(((86400*(end_date - start_date))/60)/60)-24*(trunc((((86400(end_date - start_date))/60)/60)/24)),'00')) ||'.'||
        TRIM(TO_CHAR(TRUNC((86400*(actual_completion_date - actual_start_date))/60)-60*(trunc(((86400*(end_date - start_date))/60)/60)),'00')) ||'.'||
        TRIM(TO_CHAR(TRUNC((86400*(end_date - start_date)))-60*(trunc((86400*(end_date - actual_start_date))/60)),'00')) as duration  
    FROM fnd_concurrent_requests; 

    OriginalEl autor Ratan Kumar Nahak

  7. 0

    Esta es una muy fea manera de hacerlo, y en esta primera parte no es exactamente la pregunta por el OP, pero le da una forma para obtener resultados restando 2 campos de fecha … en mi caso, la CREATED_DATE y hoy representados por SYSDATE:

    SELECT FLOOR(ABS(MONTHS_BETWEEN(CREATED_DATE, SYSDATE)) / 12) || ' years, '  
    || (FLOOR(ABS(MONTHS_BETWEEN(CREATED_DATE, SYSDATE))) - 
       (FLOOR(ABS(MONTHS_BETWEEN(CREATED_DATE, SYSDATE)) / 12)) * 12) || ' months, '  
    -- we take total days - years(as days) - months(as days) to get remaining days
    || FLOOR((SYSDATE - CREATED_DATE) -      -- total days
       (FLOOR((SYSDATE - CREATED_DATE)/365)*12)*(365/12) -      -- years, as days
       -- this is total months - years (as months), to get number of months, 
       -- then multiplied by 30.416667 to get months as days (and remove it from total days)
       FLOOR(FLOOR(((SYSDATE - CREATED_DATE)/365)*12 - (FLOOR((SYSDATE - CREATED_DATE)/365)*12)) * (365/12)))  
    || ' days, '   
    -- Here, we can just get the remainder decimal from total days minus 
    -- floored total days and multiply by 24       
    || FLOOR(
         ((SYSDATE - CREATED_DATE)-(FLOOR(SYSDATE - CREATED_DATE)))*24
       )
    || ' hours, ' 
    -- Minutes just use the unfloored hours equation minus floored hours, 
    -- then multiply by 60
    || ROUND(
           (
             (
               ((SYSDATE - CREATED_DATE)-(FLOOR(SYSDATE - CREATED_DATE)))*24
             ) - 
             FLOOR((((SYSDATE - CREATED_DATE)-(FLOOR(SYSDATE - CREATED_DATE)))*24))
           )*60
        )
    || ' minutes'  
    AS AGE FROM MyTable`

    Ofrece la salida de x años x meses, x días x horas, x minutos. Podría ser reformateado sin embargo, usted como por el cambio de las cadenas concatenadas.

    Más directamente la respuesta a la pregunta, yo he ido por delante y por escrito de cómo obtener el total de horas con minutos como hours.minutes:

    select  
    ((FLOOR(end_date - start_date))*24)
    || '.' ||
    ROUND(
           (
             (
               ((end_date - start_date)-(FLOOR(end_date - start_date)))*24
             ) - 
             FLOOR((((end_date - start_date)-(FLOOR(end_date - start_date)))*24))
           )*60
        )
    from 
    come_leav;   

    OriginalEl autor vapcguy

  8. -2

    puede trabajar con el extracto de:

    SELECT start_time, end_time, extract(HOUR FROM end_time-start_time) || '.' || extract(MINUTE FROM end_time-start_time)  
    From come_leav;
    recibo el siguiente error: SQL> SELECCIONE start_time, end_time, extracto(HORA DE end_time-start_time) || ‘.’ || extracto(MINUTO DE end_time-start_time) De come_leav; SELECCIONE start_time, end_time, extracto(HORA DE end_time-start_time) || ‘.’ || extracto(MINUTO DE end_time-start_time) De come_leav * ERROR en línea 1: ORA-30076: no válido extracto de campo para extraer la fuente
    Me sale el mismo error como Macky. Hubiera sido genial si funcionó, o podría ser hecho para trabajar.

    OriginalEl autor roselan

Dejar respuesta

Please enter your comment!
Please enter your name here