다음과 같은 테이블이 있습니다.
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에서 두 날짜 사이의 시간 (분)과 초 (일)의 차이를 어떻게 계산할 수 있습니까?
감사
답변:
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
함수를 사용하십시오 .
DATE
일 수를 얻습니다 (a NUMBER
). 그러나 TIMESTAMP
값 을 빼면 INTERVALDS
. 아마도 당신은 가치가 TIMESTAMP
아니라 일하고있을 것 DATE
입니다. 나는 대답을 편집했다.
DATE
및 TIMESTAMP
데이터 유형에는 모두 시간 (시간, 분 및 초) 구성 요소가 있습니다. TIMESTAMP
또한 분수 초 시간 구성 요소 (및 잠재적 인 표준 시간대 구성 요소)도 있습니다.
몇 초 안에 결과를 얻으려면 :
select (END_DT - START_DT)*60*60*24 from MY_TABLE;
확인 [ https://community.oracle.com/thread/2145099?tstart=0][1]
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 ;
도움이 되었기를 바랍니다.
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
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 );
' 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
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 분 동안 발생한 테이블에서 이벤트를 찾기 위해 다음을 시도하십시오.
이 항목을 사용하면 원하는 분 값을 얻을 때까지 십진수 값을 조작 할 수 있습니다. .0007 값은 sysdate 유효 자릿수에 관한 한 1 분입니다. 그 배수를 사용하여 원하는 다른 값을 얻을 수 있습니다.
select (sysdate - (sysdate - .0007)) * 1440 from dual;
결과는 1 (분)입니다.
그런 다음 확인하는 것은 간단한 문제입니다.
select * from my_table where (sysdate - transdate) < .00071;
(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
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;
또 다른 옵션이 있습니다.
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;