PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Chênh lệch múi giờ trong giờ làm việc

Tôi khuyên bạn nên tạo tất cả các phạm vi giờ làm việc giữa created_at và current_timestamp và tính tổng chúng. Mặc dù còn lâu mới là giải pháp tối ưu về mặt hiệu suất, tôi nghĩ đó là cách tiếp cận dễ hiểu nhất. Tôi sử dụng dấu thời gian với phạm vi múi giờ tstzrange với giao lộ toán tử (*) .

SELECT id,
  created_at,
  SUM(upper(business_range) - lower(business_range) ) business_hours
FROM (
  SELECT id, 
    created_at,
    tstzrange(date_in_range + '09:00'::time with time zone, date_in_range + '17:00'::time with time zone) 
      * tstzrange(created_at, current_timestamp) as business_range
  FROM (
    SELECT id,
      created_at,
      created_at::date + generate_series(0, current_timestamp::date - created_at::date) as date_in_range 
    FROM times
  ) dates_in_range
  WHERE date_part('dow', date_in_range) in (1,2,3,4,5)
) business_hour_ranges
GROUP BY
  id,
  created_at

Xem thiết lập và ví dụ trong db <> fiddle

Lời cảnh báo

Mặc dù việc triển khai được thực hiện để dễ hiểu và dễ gỡ lỗi, nó có thể dẫn đến hiệu suất kém - đặc biệt nếu được sử dụng với các ngày create_at rất cũ. Nếu điều đó có thể xảy ra trong hệ thống của bạn, tốt hơn hết bạn nên viết hàm kiểm tra ngày trong tuần của create_at và current_date, tìm số ngày giữa chúng và xác định giờ làm việc.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhận COUNT từ sqlalchemy

  2. Chơi 2.2 với Hibernate JPA và Postgres

  3. Rails - chỉ tìm các bản ghi mà has_many liên kết bản ghi có mặt

  4. Django - (OperationalError) FATAL:Xác thực danh tính không thành công cho tên người dùng

  5. TypeError:create () có nhiều giá trị cho đối số từ khóa 'context'