重要なアドバイス: 時間間隔を文字列 ( ) として保存しないでください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 NVARCHAR2
INTERVAL 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
関数を使用して、間隔 (日.時、分、秒..) から任意のコンポーネントを取得し、クエリを変更して目的の形式で表示することができます。
デモ