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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-31 20:14:14889ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。