Heim > Datenbank > MySQL-Tutorial > Wie berechnet man die Arbeitszeiten zwischen zwei Daten in PostgreSQL, ohne Wochenenden und unter Berücksichtigung spezifischer Arbeitszeiten?

Wie berechnet man die Arbeitszeiten zwischen zwei Daten in PostgreSQL, ohne Wochenenden und unter Berücksichtigung spezifischer Arbeitszeiten?

Patricia Arquette
Freigeben: 2024-12-29 06:56:11
Original
656 Leute haben es durchsucht

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

Berechnen Sie die Arbeitsstunden zwischen zwei Daten in PostgreSQL

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:

  • Zeitstempel: 3. Dezember, 14:00 bis 4. Dezember, 9:00
  • Arbeitszeit: 2 Stunden (3. Dezember = 1 Stunde, 4. Dezember = 1 Stunde)
  • Zeitstempel: 3. Dezember, 15:00 bis 7. Dezember, 8:00
  • Arbeitszeiten: 8 Stunden (3. Dezember = 0 Stunden, 4. Dezember = 8 Stunden, 5. Dezember = 0 Stunden, 6. Dezember = 0 Stunden, 7. Dezember = 0 Stunden)

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';
Nach dem Login kopieren

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';
Nach dem Login kopieren

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;
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage