IT

오라클에서 날짜를 2개 빼서 시 분 단위로 결과를 얻는 방법

itgroup 2023. 9. 20. 20:15
반응형

오라클에서 날짜를 2개 빼서 시 분 단위로 결과를 얻는 방법

나는 2개의 날짜를 빼고 결과를 시와 분 단위로 소수점 이하의 숫자로 나타내고 싶습니다.

제가 아래 표를 가지고 있는데 이렇게 하고 있는데 결과가 마음에 안 들어요.

약간의 변형이 있습니다, 이건 단순한 계산일 텐데 잘 이해가 안 되네요.

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.916666721-06-2011 07:00:00 21-06-2011 16:50:00  9.833333321-06-2011 07:20:00 21-06-2011 16:30:00  9.1666667

아래와 같은 결과(end_time-start_time)를 원합니다.

16:55- 14:00 = 2.5516:50-07:00 = 9.516:30-7:20 = 9.1 등등.

내가 어떻게 그럴 수 있을까?

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

이 코드를 발견한 사람들은 소수점 부분이 한 시간의 일부가 아니라 실제 미세한 차이라는 점에 유의해야 합니다..5, 따라서 를 나타냅니다.50 minutes,것은 아니다.30 minutes.

이거 먹어봐요.

round(to_number(end_time - start_time) * 24)

Oracle은 날짜를 일 수로 나타냅니다.(end_time-start_time)*24시간을 줍니다.당신이 이 번호를 가지고 있다고 가정해 보겠습니다.2.9166667)에서h기둥.그런 다음 원하는 형식으로 쉽게 변환할 수 있습니다.FLOOR(h) + (h-FLOOR(h))/100*60.

예:

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

사용자의 경우:

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 

하루의 시작에 시차를 추가한 다음 24시간 형식으로 시간, 분, 초를 추출합니다.

참고: 요일에 유의해야 합니다!

SQL
    with w_dates as (
      select to_date('08/08/2023 01:00:00', 'DD/MM/YYYY HH24:MI:SS') date_start, 
             to_date('08/08/2023 02:23:45', 'DD/MM/YYYY HH24:MI:SS') date_end from dual)
    select floor(date_end-date_start) days, 
           to_char(trunc(sysdate) + sum(date_end-date_start),'HH24:MI:SS') hours_minutes_seconds 
      from w_dates;
결과
DAYS | HOURS_MINUTES_SECONDS
-----------------------------
   0 | 01:23:45

시도해 보십시오.

    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;

편집: 번호가 필요하다면,

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

문자열 결과의 경우 델타가 24H보다 작으면 다음과 같이 하겠습니다.

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

아니면...'HH24:MI:SS', 하지만 그건 제 개인적인 취향입니다.

24H 이상의 기간 동안, 나는 앞에 다음과 같이 붙입니다.

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

예, 오라클이 일 단위로 계산할 때 초 단위의 정밀도로 산술 문제를 처리하는 것입니다.한 번은 회의록만 처리하기 때문에(그래서 당신의 번호를 다음으로 반올림할 수 있습니다.trunc(days*24*60+0.5)/24/60), 하지만 숫자 1/24/60에 대한 이진 산술 정확도가 여전히 문제를 일으킬 수 있습니다.

편집 2.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')

그러나 그 결과는 평균적으로 매우 혼란스러울 수 있는데, 십진법 7.50은 7시간 30분, 즉 최소 7시간 50분을 암시하는데, 이는 7시간 10분의 경과된 시간과는 대조적입니다.

이 쿼리는 저에게 매우 유용하며 HH와 같이 시간에 따라 start_date와 end_date의 차이를 원하는 사람이 있다면:MI:SS 이 쿼리를 사용하십시오.

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; 

이 첫 수 -- 저 입니다 OP , 2개의 합니다, 에는,CREATED_DATE.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`

출력은 x년, x개월, x일, x시간, x분으로 제공됩니다.연결된 문자열을 변경하여 원하는 대로 다시 포맷할 수 있습니다.

직접적으로 분)을 () 을(를)로 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;   

추출물로 작업할 수 있습니다.

SELECT start_time, end_time, extract(HOUR FROM end_time-start_time) || '.' || extract(MINUTE FROM end_time-start_time)  
From come_leav;

언급URL : https://stackoverflow.com/questions/7460266/how-to-subtract-2-dates-in-oracle-to-get-the-result-in-hour-and-minute

반응형