ホームページ > データベース > mysql チュートリアル > PostgreSQL で週末を除いた 2 つの日付の間の労働時間を計算するにはどうすればよいですか?

PostgreSQL で週末を除いた 2 つの日付の間の労働時間を計算するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-31 20:14:14
オリジナル
879 人が閲覧しました

How to Calculate Working Hours Between Two Dates in PostgreSQL, Excluding Weekends?

PostgreSQL で 2 つの日付間の労働時間を計算する

問題ステートメント

週末が異なることを考慮して、2 つのタイムスタンプ間の労働時間を計算するアルゴリズムを設計します。営業日と平日は午前 8 時から午前 3 時までカウントされますpm.

解決策

ステップ 1: 1 日あたりの労働時間を特定する

労働時間を平日の午前 8 時から午後 3 時までとして定義します。

WITH WorkingHours AS (
  SELECT '08:00'::time AS start_time, '15:00'::time AS end_time
)
ログイン後にコピー
ステップ 2: 毎日の間隔を計算する

それぞれの日ごとに一連の間隔を作成します。指定された日付範囲内の日:

ステップ 3: 各間隔の労働時間を計算する
SELECT t_id,
       generate_series(date_trunc('day', t_start), date_trunc('day', t_end), '1 day') AS day
FROM   t
ログイン後にコピー
毎日の労働時間を補間し、範囲タイプ

tsrange:

ステップ 4: 分数を計算する関数時間

小数時間を計算する関数
SELECT t_id,
       SUM(CASE
         WHEN EXTRACT(ISODOW FROM day) < 6 THEN
           COALESCE(
             f_worktime(day::timestamp + WorkingHours.start_time, day::timestamp + WorkingHours.end_time),
             '0'
           )
         ELSE
           '0'
       END) AS work_time
FROM   WorkingHours
CROSS JOIN (
  SELECT t_id, day
  FROM   temp
) AS temp
GROUP  BY 1
ログイン後にコピー
f_worktime

を定義します:

CREATE FUNCTION f_worktime(_start timestamp, _end timestamp)
RETURNS interval
LANGUAGE sql AS
$func$
SELECT COALESCE(upper(tsrange(_start::timestamp, _end::timestamp)) - lower(tsrange(_start::timestamp, _end::timestamp)), '0')::interval;
$func$
IMMUTABLE;
ログイン後にコピー
出力:

以上がPostgreSQL で週末を除いた 2 つの日付の間の労働時間を計算するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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