> 데이터 베이스 > MySQL 튜토리얼 > 주말을 제외하고 특정 근무 시간을 고려하여 PostgreSQL에서 두 날짜 사이의 근무 시간을 계산하는 방법은 무엇입니까?

주말을 제외하고 특정 근무 시간을 고려하여 PostgreSQL에서 두 날짜 사이의 근무 시간을 계산하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-29 06:56:11
원래의
656명이 탐색했습니다.

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

PostgreSQL에서 두 날짜 사이의 근무 시간 계산

문제:

두 개의 타임스탬프가 주어지면 근무 시간 수를 결정합니다. 주말은 휴무일로 간주하고 근무시간은 오전 8시부터라고 합니다. ~ 오후 3시.

예:

  • 타임스탬프: 12월 3일 14:00 ~ 12월 4일 9:00
  • 일 중 시간: 2시간(12월 3일 = 1시간, 12월 4일 = 1시간)
  • 타임스탬프: 12월 3일 15:00 ~ 12월 7일 8:00
  • 근무시간: 8시간(12월) 3일 = 0시간, 12월 4일 = 8시간, 12월 5일 = 0시간, 12월 6일 = 0시간, 12월 7일 = 0시간)

해결책 - 반올림 결과:

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';
로그인 후 복사

솔루션 - 더보기 정밀도:

더 작은 시간 단위(예: 5분 슬라이스)를 사용하면 정밀도가 더 높아집니다.

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';
로그인 후 복사

해결책 - 정확한 결과:

마이크로초 수준까지 정확한 결과를 얻으려면 다음을 사용하세요. 접근 방법:

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에서 두 날짜 사이의 근무 시간을 계산하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿