重要なアドバイス: 時間間隔を文字列 ( ) として保存しないでくださいCHAR/ VARCHAR2。クエリの作成中にそれらの操作を実装するのが難しくなり、大規模なデータ セットに対して非効率的に実行されます。
Oracle では、データベース内のこのようなインターバル レコードを正確に格納するために、2 つのデータ型を提供しています。
間隔
INTERVAL YEAR [(year_precision)] TO MONTH- 期間を年と月で保存します
INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds)]- 期間を日、時間、分、秒で保存します
2 番目のタイプは、必要な値を として保存するのに役立ちますINTERVAL .. HOUR to MINUTE。
例えば:-INTERVAL '07:30' HOUR TO MINUTE
したがって、合計演算は単純にtime_rent + time_expiredであり、これにより演算がはるかに簡単になる可能性があります。これらを文字として保存したので、Oracle はレスキュー用の関数を提供します。
TO_DSINTERVAL -データ型TO_DSINTERVALの文字列を.CHAR, VARCHAR2, NCHAR, or NVARCHAR2INTERVAL DAY TO SECOND
したがってDAY、時間列に component と seconds component(zeroes) を追加すると、それらをINTERVAL型に変換するのに役立ちます: TO_DSINTERVAL('000 '|| time_rent|| ':00')。
したがって、最終的なクエリは次のようになります。
WITH t
AS (SELECT t1.name,
TO_DSINTERVAL('000 '|| time_rent|| ':00')
+ TO_DSINTERVAL('000 '|| time_expired|| ':00') AS intv
FROM table1 t1
join table2 t2
ON t1.name = t2.name)
SELECT name,
EXTRACT(day FROM intv) * 24 + EXTRACT(hour FROM intv) --hours
|| ':'
|| EXTRACT(minute FROM intv) as duration -- minutes
FROM t;
追加操作により合計時間が 24 時間 (26) を超えるため、デフォルトでは間隔は と見なされ1 day 2 hoursます。このEXTRACT関数は、目的のHH:MM形式で o/p を取得するために使用されます。このEXTRACT関数を使用して、間隔 (日.時、分、秒..) から任意のコンポーネントを取得し、クエリを変更して目的の形式で表示することができます。
デモ