ホームページ > データベース > mysql チュートリアル > Oracle SQLで営業時間を考慮して経過時間を計算するにはどうすればよいですか?

Oracle SQLで営業時間を考慮して経過時間を計算するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-24 20:42:15
オリジナル
722 人が閲覧しました

How to Calculate Elapsed Hours Considering Business Hours in Oracle SQL?

Oracle SQL での営業時間に基づく時間の計算

営業時間の制約を考慮しながら開始時刻と終了時刻の間の経過時間を測定するには、以下が必要です。営業日の制限を計算に組み込むためです。 Oracle SQL でこれを実現するアプローチは次のとおりです。

営業時間調整による直接計算:

このメソッドは、定義された営業時間に基づいて調整して時間差を直接計算します。

SELECT task,
       start_time,
       end_time,
       ROUND(
         (
           -- Calculate full weeks difference from start of ISO weeks.
           ( TRUNC( end_time, 'IW' ) - TRUNC( start_time, 'IW' ) ) * (10/24) * (6/7)
           -- Add full days for the final week.
           + LEAST( TRUNC( end_time ) - TRUNC( end_time, 'IW' ), 6 ) * (10/24)
           -- Subtract full days from days of the week before the start date.
           - LEAST( TRUNC( start_time ) - TRUNC( start_time, 'IW' ), 6 ) * (10/24)
           -- Add hours of final day
           + LEAST( GREATEST( end_time - TRUNC( end_time ) - 8/24, 0 ), 10/24 )
           -- Subtract hours of the day before the range starts.
           - LEAST( GREATEST( start_time - TRUNC( start_time ) - 8/24, 0 ), 10/24 )
         )
         -- Multiply to give minutes instead of fractions of full days.
         * 24,
         15 -- Number of decimal places
       ) AS work_day_hours_diff
FROM   your_table;
ログイン後にコピー

営業日を含む階層クエリ生成:

または、営業日ごとに 1 行を生成し、1 日あたりの時間を計算し、それらを合計することもできます:

SELECT task,
       COALESCE( SUM( end_time - start_time ), 0 ) * 24 AS total_hours
FROM   (
  SELECT task,
         GREATEST( t.start_time, d.column_value + INTERVAL '8' HOUR ) AS start_time,
         LEAST( t.end_time, d.column_value + INTERVAL '18' HOUR ) AS end_time
  FROM   your_table t
         LEFT OUTER JOIN
         TABLE(
           CAST(
             MULTISET(
               SELECT TRUNC( t.start_time + LEVEL - 1 )
               FROM   DUAL
               WHERE  TRUNC( t.start_time + LEVEL - 1 ) - TRUNC( t.start_time + LEVEL - 1, 'iw' ) < 6
               CONNECT BY TRUNC( t.start_time + LEVEL - 1 ) < t.end_time
             ) AS SYS.ODCIDATELIST
           )
         ) d
         ON (   t.end_time   > d.column_value + INTERVAL  '8' HOUR
            AND t.start_time < d.column_value + INTERVAL '18' HOUR )
)
GROUP BY task;
ログイン後にコピー

どちらの方法も月曜日から土曜日、08 を考慮します。営業時間は00時から18時までとなります。営業時間が異なる場合は、クエリ内の営業時間の定義を必ず調整してください。

以上がOracle SQLで営業時間を考慮して経過時間を計算するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート