Oracle SQL에서 두 날짜 / 시간의 차이 계산


88

다음과 같은 테이블이 있습니다.

Filename - varchar
Creation Date - Date format dd/mm/yyyy hh24:mi:ss
Oldest cdr date - Date format dd/mm/yyyy hh24:mi:ss

Oracle SQL에서 두 날짜 사이의 시간 (분)과 초 (일)의 차이를 어떻게 계산할 수 있습니까?

감사


답변:


118

Oracle에서 날짜를 뺄 수 있습니다. 이것은 당신에게 일의 차이를 줄 것입니다. 시간을 얻으려면 24를 곱하는 식입니다.

SQL> select oldest - creation from my_table;

날짜가 문자 데이터로 저장되어있는 경우 먼저 날짜 유형으로 변환해야합니다.

SQL> select 24 * (to_date('2009-07-07 22:00', 'YYYY-MM-DD hh24:mi') 
             - to_date('2009-07-07 19:30', 'YYYY-MM-DD hh24:mi')) diff_hours 
       from dual;

DIFF_HOURS
----------
       2.5

참고 :

이 대답은 Oracle 데이터 유형이 나타내는 날짜에 적용됩니다 DATE. Oracle TIMESTAMP에는 날짜 (시간 포함)를 나타낼 수도 있는 데이터 유형 도 있습니다. TIMESTAMP값 을 빼면 INTERVAL; 숫자 값을 추출하려면 EXTRACT함수를 사용하십시오 .


3
Oracle의 행동이 어느 시점에서 변경 되었습니까? 다른 날짜에서 하나의 날짜를 뺄 때 INTERVAL단순한 부동이 아닌 데이터 유형을 얻습니다 .

2
@JonofAllTrades : 아니요, 유형의 값을 빼면 DATE일 수를 얻습니다 (a NUMBER). 그러나 TIMESTAMP값 을 빼면 INTERVALDS. 아마도 당신은 가치가 TIMESTAMP아니라 일하고있을 것 DATE입니다. 나는 대답을 편집했다.
sleske

메모와 관련하여- DATETIMESTAMP데이터 유형에는 모두 시간 (시간, 분 및 초) 구성 요소가 있습니다. TIMESTAMP또한 분수 초 시간 구성 요소 (및 잠재적 인 표준 시간대 구성 요소)도 있습니다.
MT0

"이것은 당신에게 일의 차이를 줄 것입니다." Oracle 문서에 링크 할 수 있습니까?
Roland


16
declare
strTime1 varchar2(50) := '02/08/2013 01:09:42 PM';
strTime2 varchar2(50) := '02/08/2013 11:09:00 PM';
v_date1 date := to_date(strTime1,'DD/MM/YYYY HH:MI:SS PM');
v_date2 date := to_date(strTime2,'DD/MM/YYYY HH:MI:SS PM');
difrence_In_Hours number;
difrence_In_minutes number;
difrence_In_seconds number;
begin
    difrence_In_Hours   := (v_date2 - v_date1) * 24;
    difrence_In_minutes := difrence_In_Hours * 60;
    difrence_In_seconds := difrence_In_minutes * 60;

    dbms_output.put_line(strTime1);        
    dbms_output.put_line(strTime2);
    dbms_output.put_line('*******');
    dbms_output.put_line('difrence_In_Hours  : ' || difrence_In_Hours);
    dbms_output.put_line('difrence_In_minutes: ' || difrence_In_minutes);
    dbms_output.put_line('difrence_In_seconds: ' || difrence_In_seconds);        
end ;

도움이 되었기를 바랍니다.


14
select 
    extract( day from diff ) Days, 
    extract( hour from diff ) Hours, 
    extract( minute from diff ) Minutes 
from (
        select (CAST(creationdate as timestamp) - CAST(oldcreationdate as timestamp)) diff   
        from [TableName] 
     );

이렇게하면 일, 시간 및 분으로 세 개의 열이 제공됩니다.


8

다음을 시도해 볼 수도 있습니다.

select to_char(to_date('1970-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss')+(end_date - start_date),'hh24:mi:ss')
       as run_time from some_table;

00:01:34와 같이 사람이 읽을 수있는 형식으로 시간을 표시합니다. 날짜도 필요하면 마지막 형식화 문자열에 DD를 추가하면됩니다.


7

to_timestamp 함수를 사용하여 날짜를 타임 스탬프로 변환하고 빼기 연산을 수행 할 수 있습니다.

다음과 같은 것 :

SELECT 
TO_TIMESTAMP ('13.10.1990 00:00:00','DD.MM.YYYY HH24:MI:SS')  - 
TO_TIMESTAMP ('01.01.1990:00:10:00','DD.MM.YYYY:HH24:MI:SS')
FROM DUAL

나는 to_date와 to_timestamp를 모두 시도했고 둘 다 나에게 대답을 줘서 반올림하여 차이가 1 시간이면 0의 대답을 받고이 값에 24를 곱하면 0이됩니다. 입력하면 정답을받습니다. 날짜 시간이지만 25m 행에서는 이것을 할 수 없습니다. 이견있는 사람?
Steve

3
타임 스탬프 사이의 빼기를 사용하면 "DAYS HOUR : MINS : SECS.milisecs"와 같은 형식으로 다른 타임 스탬프가 반환됩니다. 당신은 당신이 필요로하는 값을 얻기 위해이 TRUNC 수
HyLian

6
타임 스탬프 사이를 빼면 INTERVAL 데이터 유형이 반환됩니다. EXTRACT 함수를 사용하여 간격의 다양한 부분을 반환 할 수 있습니다. 예를 들어 select extract (hour from (timestamp '2009-12-31 14:00:00'-timestamp '2009-12-31 12:15:00')) hr 듀얼에서; 참고 : HOUR 부분 만 표시되므로 차이가 1 일 1 시간이면 25가 아닌 1이 표시됩니다.
Gary Myers

5

컴퓨터의 HIREDATE부터 시스템 날짜까지의 연령 계산

SELECT HIREDATE||'        '||SYSDATE||'       ' ||
TRUNC(MONTHS_BETWEEN(SYSDATE,HIREDATE)/12) ||' YEARS '||
TRUNC((MONTHS_BETWEEN(SYSDATE,HIREDATE))-(TRUNC(MONTHS_BETWEEN(SYSDATE,HIREDATE)/12)*12))||
'MONTHS' AS "AGE  "  FROM EMP;

3
select days||' '|| time from (
SELECT to_number( to_char(to_date('1','J') +
    (CLOSED_DATE - CREATED_DATE), 'J') - 1)  days,
   to_char(to_date('00:00:00','HH24:MI:SS') +
      (CLOSED_DATE - CREATED_DATE), 'HH24:MI:SS') time
 FROM  request  where REQUEST_ID=158761088 );

3

오라클 11g에서

SELECT end_date - start_date AS day_diff FROM tablexxx
suppose the starT_date end_date is define in the tablexxx

2

' your_table ' 에서 두 개의 날짜를 선택 하고 결과를 단일 열 출력 (예 : ' days-hh : mm : ss ')으로보기를 원한다면 다음과 같이 사용할 수 있습니다. 먼저이 두 날짜 사이의 간격을 계산 한 후 해당 간격에서 필요한 모든 데이터를 내보낼 수 있습니다.

         select     extract (day from numtodsinterval (second_date
                                                   - add_months (created_date,
                                                                 floor (months_between (second_date,created_date))),
                                                   'day'))
             || ' days - '
             || extract (hour from numtodsinterval (second_date
                                                    - add_months (created_date,
                                                                  floor (months_between (second_date,created_date))),
                                                    'day'))
             || ':'
             || extract (minute from numtodsinterval (second_date
                                                      - add_months (created_date,
                                                                    floor (months_between (second_date, created_date))),
                                                      'day'))
             || ':'
             || extract (second from numtodsinterval (second_date
                                                      - add_months (created_date,
                                                                    floor (months_between (second_date, created_date))),
                                                      'day'))
     from    your_table

그러면 다음과 같은 결과를 얻을 수 있습니다. 0 일-1 :14: 55


1
select (floor(((DATE2-DATE1)*24*60*60)/3600)|| ' : ' ||floor((((DATE2-DATE1)*24*60*60) -floor(((DATE2-DATE1)*24*60*60)/3600)*3600)/60)|| '  ' ) as time_difference from TABLE1 

1

좀 더 간단 해 보이는 것을 원한다면 지난 1 분 동안 발생한 테이블에서 이벤트를 찾기 위해 다음을 시도하십시오.

이 항목을 사용하면 원하는 분 값을 얻을 때까지 십진수 값을 조작 할 수 있습니다. .0007 값은 sysdate 유효 자릿수에 관한 한 1 분입니다. 그 배수를 사용하여 원하는 다른 값을 얻을 수 있습니다.

select (sysdate - (sysdate - .0007)) * 1440 from dual;

결과는 1 (분)입니다.

그런 다음 확인하는 것은 간단한 문제입니다.

select * from my_table where (sysdate - transdate) < .00071;

1
(TO_DATE(:P_comapre_date_1, 'dd-mm-yyyy hh24:mi') - TO_DATE(:P_comapre_date_2, 'dd-mm-yyyy hh24:mi'))*60*60*24 sum_seconds,
         (TO_DATE(:P_comapre_date_1, 'dd-mm-yyyy hh24:mi') - TO_DATE(:P_comapre_date_2, 'dd-mm-yyyy hh24:mi'))*60*24 sum_minutes,
         (TO_DATE(:P_comapre_date_1, 'dd-mm-yyyy hh24:mi') - TO_DATE(:P_comapre_date_2, 'dd-mm-yyyy hh24:mi'))*24 sum_hours,
         (TO_DATE(:P_comapre_date_1, 'dd-mm-yyyy hh24:mi') - TO_DATE(:P_comapre_date_2, 'dd-mm-yyyy hh24:mi')) sum_days 

1
select to_char(actual_start_date,'DD-MON-YYYY hh24:mi:ss') start_time,
to_char(actual_completion_date,'DD-MON-YYYY hh24:mi:ss') end_time,
floor((actual_completion_date-actual_start_date)*24*60)||'.'||round(mod((actual_completion_date-actual_start_date)*24*60*60,60)) diff_time
from fnd_concurrent_requests 
order by request_id desc;  

0
$sql="select bsp_bp,user_name,status,
to_char(ins_date,'dd/mm/yyyy hh12:mi:ss AM'),
to_char(pickup_date,'dd/mm/yyyy hh12:mi:ss AM'),
trunc((pickup_date-ins_date)*24*60*60,2),message,status_message 
from valid_bsp_req where id >= '$id'"; 

0

다음 날짜 사이의 시간을 계산합니다.

SELECT
  (TO_CHAR( TRUNC (ROUND(((sysdate+1) - sysdate)*24,2))*60,'999999')
  +
  TO_CHAR(((((sysdate+1)-sysdate)*24)- TRUNC(ROUND(((sysdate+1) - sysdate)*24,2)))/100*60 *100, '09'))/60
FROM dual

0

또 다른 옵션이 있습니다.

with tbl_demo AS
    (SELECT TO_DATE('11/26/2013 13:18:50', 'MM/DD/YYYY HH24:MI:SS') dt1
   , TO_DATE('11/28/2013 21:59:12', 'MM/DD/YYYY HH24:MI:SS') dt2 
     FROM dual)
SELECT dt1
     , dt2
     , round(dt2 - dt1,2) diff_days
     , round(dt2 - dt1,2)*24 diff_hrs
     , numtodsinterval((dt2 - dt1),'day') diff_dd_hh_mm_ss
  from tbl_demo;

0

두 타임 스탬프 열의 시차를 반환하는 단일 쿼리 :

select INS_TS, MAIL_SENT_TS, extract( hour from (INS_TS - MAIL_SENT_TS) ) timeDiff 
from MAIL_NOTIFICATIONS;

0

날짜를 얻으려면 테이블과 열을 사용하십시오.

SELECT TO_DATE( TO_CHAR(COLUMN_NAME_1, 'YYYY-MM-DD'), 'YYYY-MM-DD') - 
       TO_DATE(TO_CHAR(COLUMN_NAME_2, 'YYYY-MM-DD') , 'YYYY-MM-DD')  AS DATEDIFF       
FROM TABLE_NAME;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.