3

2 つのテーブルの異なる oracle でデータ型 char のレコードを合計するクエリを作成しようとしています。私はこのようなテーブルを持っています:

table 1:

name             time_rent
---------------- -----------
james            07:30

nameそしてtimecharです

table 2:

name             time_expired
---------------- -----------
james            18:30

nameそしてtimecharです

合計時間(期間)を取得するために合計を使用してレコードを表示する方法は可能ですか? Oracle Database 18c Enterprise Edition を使用して Oracle Live SQL でコーディングし、テストしました。

4

2 に答える 2

1

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

デモ

于 2018-03-31T07:47:59.277 に答える