Problem:
Bestimmen Sie anhand von zwei Zeitstempeln die Anzahl der Arbeitsstunden zwischen ihnen, wobei Wochenenden als arbeitsfreie Tage gelten und die Arbeitszeiten von 8:00 bis 3:00 Uhr reichen PM.
Beispiele:
Lösung – Gerundete Ergebnisse:
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';
Lösung – Mehr Präzision:
Die Verwendung kleinerer Zeiteinheiten (z. B. 5-Minuten-Slices) bietet mehr Präzision:
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';
Lösung - Exakte Ergebnisse:
Für genaue Ergebnisse bis auf die Mikrosekundenebene verwenden Sie den folgenden Ansatz:
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;
Das obige ist der detaillierte Inhalt vonWie berechnet man die Arbeitszeiten zwischen zwei Daten in PostgreSQL, ohne Wochenenden und unter Berücksichtigung spezifischer Arbeitszeiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!