Rumah > pangkalan data > tutorial mysql > Bagaimana Mengira Waktu Kerja Antara Dua Tarikh dalam PostgreSQL, Tidak Termasuk Hujung Minggu dan Mempertimbangkan Waktu Kerja Tertentu?

Bagaimana Mengira Waktu Kerja Antara Dua Tarikh dalam PostgreSQL, Tidak Termasuk Hujung Minggu dan Mempertimbangkan Waktu Kerja Tertentu?

Patricia Arquette
Lepaskan: 2024-12-29 06:56:11
asal
639 orang telah melayarinya

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

Kira Waktu Kerja antara 2 Tarikh dalam PostgreSQL

Masalah:

Diberi dua cap waktu, tentukan bilangan waktu bekerja antara mereka, menganggap hujung minggu sebagai hari tidak bekerja dan waktu bekerja adalah dari 8:00 AM hingga 3:00 PTG.

Contoh:

  • Cap Masa: 3 Dis, 14:00 hingga 4 Dis, 9:00
  • Waktu Kerja: 2 jam (3 Dis = 1 jam, 4 Dis = 1 jam)
  • Cap Masa: 3 Dis, 15:00 hingga 7 Dis, 8:00
  • Bekerja Jam: 8 jam (3 Dis = 0 jam, 4 Dis = 8 jam, 5 Dis = 0 jam, 6 Dis = 0 jam, 7 Dis = 0 jam)

Penyelesaian - Keputusan Bulat:

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';
Salin selepas log masuk

Penyelesaian - Lebih Ketepatan:

Menggunakan unit masa yang lebih kecil (cth., hirisan 5 minit) memberikan lebih ketepatan:

SELECT count(*) * interval '5 min' AS work_interval
FROM   generate_series (timestamp '2013-06-24 13:30',
                      timestamp '2013-06-24 15:29' - interval '5 min',
                      interval '5 min') h
WHERE  EXTRACT(ISODOW FROM h) < 6
AND    h::time >= '08:00'
AND    h::time <= '14:55';
Salin selepas log masuk

Penyelesaian - Keputusan Tepat:

Untuk hasil yang tepat hingga ke tahap mikrosaat, gunakan yang berikut pendekatan:

SELECT t_id
     , COALESCE(h.h, '0')  -- add / subtract fractions
       - CASE WHEN EXTRACT(ISODOW FROM t_start) < 6
               AND t_start::time > v_start
               AND t_start::time < v_end
         THEN t_start - date_trunc('hour', t_start)
         ELSE '0'::interval END
       + CASE WHEN EXTRACT(ISODOW FROM t_end) < 6
               AND t_end::time > v_start
               AND t_end::time < v_end
         THEN t_end - date_trunc('hour', t_end)
         ELSE '0'::interval END                 AS work_interval
FROM   t CROSS JOIN var
LEFT   JOIN (  -- count full hours, similar to above solutions
   SELECT t_id, count(*)::int * interval '1h' AS h
   FROM  (
      SELECT t_id, v_start, v_end
           , generate_series (date_trunc('hour', t_start)
                            , date_trunc('hour', t_end) - interval '1h'
                            , interval '1h') AS h
      FROM   t, var
      ) sub
   WHERE  EXTRACT(ISODOW FROM h) < 6
   AND    h::time >= v_start
   AND    h::time <= v_end - interval '1h'
   GROUP  BY 1
   ) h USING (t_id)
ORDER  BY 1;
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana Mengira Waktu Kerja Antara Dua Tarikh dalam PostgreSQL, Tidak Termasuk Hujung Minggu dan Mempertimbangkan Waktu Kerja Tertentu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan