>데이터 베이스 >MySQL 튜토리얼 >주말과 특정 근무 시간을 고려하여 PostgreSQL에서 날짜 간 근무 시간을 어떻게 계산할 수 있나요?

주말과 특정 근무 시간을 고려하여 PostgreSQL에서 날짜 간 근무 시간을 어떻게 계산할 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2025-01-03 10:35:40375검색

How Can I Calculate Working Hours Between Dates in PostgreSQL, Considering Weekends and Specific Working Hours?

PostgreSQL에서 날짜 간 근무 시간 계산

소개

다양한 시나리오에서 두 타임스탬프 사이의 근무 시간 수는 급여 및 급여와 같은 분야에서 필수적인 것으로 입증될 수 있습니다. 일정. PostgreSQL에서 이 계산을 수행하려면 요일 및 시간별 매개변수를 신중하게 고려해야 합니다. 이 글에서는 다음 기준을 고려하여 포괄적인 솔루션을 설명합니다.

  • 주말(토요일, 일요일)은 근무 시간에서 제외됩니다.
  • 근무 시간은 월요일~금요일, 오전 8시~3시로 정의됨 pm.
  • 소수 시간도 계산에 포함됩니다.

해결책

방법 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 &amp;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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.