私は次のようなテーブルを持っています:
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の2つの日付の時間、分、秒(場合によっては日)の差を計算するにはどうすればよいですか?
ありがとう
回答:
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
、日数が(として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
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;
' your_table 'から2つの日付を選択し、結果を1つの列の出力として表示したい場合(例: ' days --hh:mm:ss ')、次のようなものを使用できます。まず、これら2つの日付の間の間隔を計算し、その後、その間隔から必要なすべてのデータをエクスポートできます。
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分間に発生したテーブル内のイベントを見つけるためにこれを試してください。
このエントリを使用すると、必要な分の値が得られるまで10進値をいじることができます。sysdateの有効数字に関する限り、値.0007はたまたま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;