집 >데이터 베이스 >MySQL 튜토리얼 >주말과 특정 근무 시간을 고려하여 PostgreSQL에서 날짜 간 근무 시간을 어떻게 계산할 수 있나요?
PostgreSQL에서 날짜 간 근무 시간 계산
소개
다양한 시나리오에서 두 타임스탬프 사이의 근무 시간 수는 급여 및 급여와 같은 분야에서 필수적인 것으로 입증될 수 있습니다. 일정. PostgreSQL에서 이 계산을 수행하려면 요일 및 시간별 매개변수를 신중하게 고려해야 합니다. 이 글에서는 다음 기준을 고려하여 포괄적인 솔루션을 설명합니다.
해결책
방법 1: 반올림 단 두 개의 타임스탬프에 대한 결과
이것은 접근 방식은 소수 시간을 무시하고 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 &lt;= '14:00';
예 입력:
2013-06-24 13:30, 2013-06-24 15:29
출력:
2
방법 2: 타임스탬프 테이블의 반올림 결과
이 접근 방식은 이전 방법을 확장하여 타임스탬프 테이블을 처리합니다. pair.
쿼리:
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;
방법 3: 보다 정확한 계산
더 세밀한 계산을 위해서는 더 작은 시간 단위가 가능합니다. 고려됩니다.
쿼리:
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' GROUP BY 1 ORDER BY 1;
예 입력:
| t_id | t_start | t_end | |------|-------------------------|-------------------------| | 1 | 2009-12-03 14:00:00 | 2009-12-04 09:00:00 | | 2 | 2009-12-03 15:00:00 | 2009-12-07 08:00:00 | | 3 | 2013-06-24 07:00:00 | 2013-06-24 12:00:00 | | 4 | 2013-06-24 12:00:00 | 2013-06-24 23:00:00 | | 5 | 2013-06-23 13:00:00 | 2013-06-25 11:00:00 | | 6 | 2013-06-23 14:01:00 | 2013-06-24 08:59:00 |
출력:
| t_id | work_interval | |------|----------------| | 1 | 1 hour | | 2 | 8 hours | | 3 | 0 hours | | 4 | 0 hours | | 5 | 6 hours | | 6 | 1 hour |
방법 4: 정확한 결과
이 접근 방식 마이크로초 정밀도로 정확한 결과를 제공합니다. 더 복잡하지만 계산 측면에서는 더 효율적입니다.
쿼리:
WITH var AS (SELECT '08:00'::time AS v_start , '15:00'::time AS v_end) 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;
이 포괄적인 솔루션은 PostgreSQL에서 근무 시간을 정확하고 효율적으로 계산해야 하는 요구 사항을 해결합니다.
위 내용은 주말과 특정 근무 시간을 고려하여 PostgreSQL에서 날짜 간 근무 시간을 어떻게 계산할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!