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:
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';
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';
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;
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!