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

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

Linda Hamilton
リリース: 2024-12-31 12:15:09
オリジナル
882 人が閲覧しました

How to Calculate Working Hours Between Two Dates in PostgreSQL?

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

特定のタイムスタンプ間の労働時間を計算する場合、週末と指定された労働時間を考慮する必要があります。 PostgreSQL では、このタスクを達成するためにさまざまなテクニックを活用できます。

四捨五入された結果

特定のタイムスタンプ範囲の場合:

1 時間の単位を考慮します。分数は無視します。式は次のとおりです:

SELECT count(*) AS work_hours
FROM   generate_series(timestamp '2013-06-24 13:30',
                      timestamp '2013-06-24 15:29' - interval '1h',
                      interval '1h') h
WHERE  EXTRACT(ISODOW FROM h) < 6
AND    h::time >= '08:00'
AND    h::time <= '14:00';
ログイン後にコピー

テーブル全体の場合:

-- Table Creation and Data Insertion
CREATE TABLE t (t_id int PRIMARY KEY, t_start timestamp, t_end timestamp);
INSERT INTO t VALUES
  (1, '2009-12-03 14:00', '2009-12-04 09:00')
, (2, '2009-12-03 15:00', '2009-12-07 08:00')
, (3, '2013-06-24 07:00', '2013-06-24 12:00')
, (4, '2013-06-24 12:00', '2013-06-24 23:00')
, (5, '2013-06-23 13:00', '2013-06-25 11:00')
, (6, '2013-06-23 14:01', '2013-06-24 08:59');

-- Main Query
SELECT t_id, count(*) AS work_hours
FROM  (
   SELECT t_id, generate_series(t_start, t_end - interval '1h', interval '1h') AS h
   FROM   t
   ) sub
WHERE  EXTRACT(ISODOW FROM h) < 6
AND    h::time >= '08:00'
AND    h::time <= '14:00'
GROUP  BY 1
ORDER  BY 1;
ログイン後にコピー
より正確な結果

精度を高くするには、より小さい値を使用します時間単位 (5 分スライスなど)。

-- Precision with 5-minute Slices
SELECT t_id, count(*) * interval '5 min' AS work_interval
FROM  (
   SELECT t_id, generate_series(t_start, t_end - interval '5 min', interval '5 min') AS h
   FROM   t
   ) sub
WHERE  EXTRACT(ISODOW FROM h) < 6
AND    h::time >= '08:00'
AND    h::time <= '14:55'  -- 15.00 - interval '5 min'
GROUP  BY 1
ORDER  BY 1;
ログイン後にコピー
正確結果

マイクロ秒まで正確な結果を得るには、開始時間と終了時間を個別に処理します。

Postgres 8.4 :

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

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