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

Nhóm ngày giờ của MySQL thành các khoảng thời gian bất kể múi giờ

Bạn có thể sử dụng TIMESTAMPDIFF để nhóm theo khoảng thời gian:

Trong một khoảng thời gian cụ thể của giờ, bạn có thể sử dụng:

SELECT   '2012-08-03 00:00:00' + 
         INTERVAL FLOOR(TIMESTAMPDIFF(HOUR, '2012-08-03 00:00:00', timestamp) / <n>) * <n> HOUR AS start_time,
         COUNT(*) AS total 
FROM     event 
WHERE    timestamp >= '2012-08-03 00:00:00'
GROUP BY start_time

Thay thế các lần xuất hiện của 2012-08-03 00:00:00 với ngày đầu vào tối thiểu của bạn.

<n> là khoảng thời gian được chỉ định của bạn tính bằng giờ (mỗi 2 giờ, 3 giờ, v.v.), và bạn có thể làm như vậy trong vài phút:

SELECT   '2012-08-03 00:00:00' + 
         INTERVAL FLOOR(TIMESTAMPDIFF(MINUTE, '2012-08-03 00:00:00', timestamp) / <n>) * <n> MINUTE AS start_time,
         COUNT(*) AS total 
FROM     event 
WHERE    timestamp >= '2012-08-03 00:00:00'
GROUP BY start_time

Ở đâu <n> là khoảng thời gian được chỉ định của bạn tính bằng phút (mỗi 45 phút, 90 phút, v.v.).

Hãy chắc chắn rằng bạn đang vượt qua ngày nhập liệu tối thiểu của mình (trong ví dụ này là 2012-08-03 00:00:00 ) làm tham số thứ hai cho TIMESTAMPDIFF .

CHỈNH SỬA: Nếu bạn không muốn lo lắng về việc chọn đơn vị khoảng thời gian nào trong TIMESTAMPDIFF , thì tất nhiên chỉ cần thực hiện khoảng thời gian theo giây (300 =5 phút, 3600 =1 giờ, 7200 =2 giờ, v.v.)

SELECT   '2012-08-03 00:00:00' + 
         INTERVAL FLOOR(TIMESTAMPDIFF(SECOND, '2012-08-03 00:00:00', timestamp) / <n>) * <n> SECOND AS start_time,
         COUNT(*) AS total 
FROM     event 
WHERE    timestamp >= '2012-08-03 00:00:00'
GROUP BY start_time

EDIT2: Để giải quyết nhận xét của bạn liên quan đến việc giảm số vùng trong câu lệnh mà bạn phải chuyển vào ngày tham số tối thiểu của mình, bạn có thể sử dụng:

SELECT   b.mindate + 
         INTERVAL FLOOR(TIMESTAMPDIFF(SECOND, b.mindate, timestamp) / <n>) * <n> SECOND AS start_time,
         COUNT(*) AS total 
FROM     event 
JOIN     (SELECT '2012-08-03 00:00:00' AS mindate) b ON timestamp >= b.mindate
GROUP BY start_time

Và chỉ cần chuyển tham số ngày giờ tối thiểu của bạn một lần vào phần chọn phụ tham gia.

Bạn thậm chí có thể tạo cột thứ hai trong phần chọn phụ tham gia cho khoảng thời gian tính theo giây của mình (ví dụ:3600 ) và đặt tên cho cột như secinterval ... sau đó thay đổi <n> của b.secinterval , vì vậy bạn chỉ phải chuyển tham số ngày tối thiểu VÀ khoảng thời gian mỗi lần một lần.

SQLFiddle Demo



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. tìm trong bộ ở laravel? ví dụ

  2. Cấp quyền cho người dùng MySQL trên Linux thông qua dòng lệnh

  3. Sử dụng Cơ sở dữ liệu quan hệ MySQL trên Fedora 14

  4. Hợp nhất 2 mảng và tính tổng các giá trị (Phím số)

  5. Cách tìm đối chiếu trong MySQL