Nhóm thành các khoảng thời gian
Bạn nên sử dụng nhóm group by
để tạo một nhóm cho mỗi khoảng thời gian mà bạn muốn lấy trung bình.
select avg(Column), convert((min(datetime) div 500)*500 + 230, datetime) as time
from Databasename.tablename
where datetime BETWEEN '2012-09-08 00:00:00' AND '2012-09-08 15:30:00'
group by datetime div 500
Điều này tận dụng thực tế là ngày và giờ có thể được chuyển đổi ngầm thành một số, sau đó sẽ có định dạng YYMMDDhhmmss
. Chia một số như vậy cho 100 sẽ chia thành giây và tương tự chia cho 500 sẽ thu được một số duy nhất cho mỗi khoảng thời gian 5 phút.
Cột bổ sung mà tôi đã chọn sẽ cung cấp cho khoảng thời gian giữa:bất kỳ thời gian nào từ khoảng thời gian (ở đây chọn mức tối thiểu, nhưng nó không thực sự quan trọng), được chuyển thành số khoảng thời gian 5 phút đó, trở lại thành ngày và giờ số, và sau đó thêm hai phút rưỡi. Bạn có thể sử dụng cú pháp tương tự để tính toán đầu (chỉ cần để lại + 230
hết) hoặc (bao gồm) kết thúc (+ 459
) của khoảng thời gian.
Đã kiểm tra bằng cách sử dụng sqlfiddle .
Xử lý cuối dải
Lưu ý rằng BETWEEN
của bạn phạm vi sẽ bao gồm các hàng từ 15:30:00
nhưng không có người khác từ khoảng thời gian bắt đầu vào thời điểm đó. Có thể bạn muốn loại trừ phần cuối của phạm vi khỏi lựa chọn của mình:
where datetime >= '2012-09-08 00:00:00' AND datetime < '2012-09-08 15:30:00'
Tại sao bạn nhận được NULL
Về lý do tại sao truy vấn của bạn cho ra NULL
:Để tính toán khoảng thời gian, bạn không đặt toàn bộ khoảng thời gian trong dấu ngoặc kép và bạn sử dụng tên số ít cho các đơn vị thời gian. Tức là
'2012-09-08 15:30:00' + INTERVAL 5 minute
Nhưng điều này chỉ đơn giản là mở rộng phạm vi thành 2012-09-08 15:35:00
và vẫn không tạo những khoảng thời gian 5 phút mà bạn muốn. Theo cách bạn viết, bạn đang cố gắng thêm hai chuỗi, điều này không thể thực hiện được trong MySQL trừ khi các chuỗi có thể được chuyển đổi thành số, trong trường hợp đó, những số đó sẽ được thêm vào.
Bạn có thể muốn sử dụng số học khoảng thời gian để tính toán kết thúc duy nhất của khoảng thời gian, tức là giây đầu tiên sau khoảng thời gian:
convert((min(datetime) div 500)*500, datetime) + INTERVAL 5 minute as endOfInterval
Chỉ cần thêm 500
thay vì 230
truy vấn của tôi sẽ không hoạt động vì số kết quả có thể đại diện cho một ngày không hợp lệ trong khoảng thời gian cuối cùng của mỗi giờ.