Bạn cần một nguồn hàng với tất cả số lần bạn muốn được trả lại. Sau đó, bạn có thể sử dụng thao tác JOIN để chọn các hàng được trả về.
Nếu bạn có một bảng như thế này:
CREATE TABLE cal (tm TIME NOT NULL PRIMARY KEY) ENGINE=InnoDB ;
INSERT INTO cal (tm) VALUES ('00:00:00'),('00:30:00');
INSERT INTO cal (tm) SELECT ADDTIME(tm,'01:00:00') FROM cal;
INSERT INTO cal (tm) SELECT ADDTIME(tm,'02:00:00') FROM cal;
INSERT INTO cal (tm) SELECT ADDTIME(tm,'04:00:00') FROM cal;
...
Sau đó, bạn có thể sử dụng nó trong truy vấn của mình:
SELECT v.id
, c.tm
FROM myview v
JOIN cal c
ON c.tm >= v.hour_from
AND c.tm <= v.hour_to
ORDER BY v.id, c.tm
Nếu bạn muốn các giá trị thời gian ở một định dạng cụ thể, bạn có thể sử dụng DATE_FORMAT
chức năng:
SELECT v.id
, DATE_FORMAT(c.tm,'%H:%i') AS hour_
Điều này giả định rằng các giá trị được trả về bởi chế độ xem là TIME
loại dữ liệu. Nếu không, bạn sẽ muốn chuyển đổi chúng. (Hoặc bạn có thể nhận được kết quả tương tự khi làm việc với các chuỗi ký tự ở định dạng chuẩn.)
LƯU Ý:Bạn không bắt buộc phải có một bảng; nó có thể là bất kỳ nguồn hàng nào, chẳng hạn như dạng xem nội tuyến. Bạn chỉ cần đủ hàng (trong trường hợp của bạn, giả sử tăng nửa giờ từ 00:00 đến 23:30, tức là 48 hàng.)
Nếu bạn có bất kỳ phạm vi thời gian nào "vượt qua" ranh giới nửa đêm (ví dụ:22:00 đến 02:00), truy vấn mẫu sẽ không trả về bất kỳ hàng nào. Bạn cần phải điều chỉnh.
Một cái gì đó như:
JOIN cal c
ON ( t.hour_from <= t.hour_to
AND c.tm >= v.hour_from
AND c.tm <= v.hour_to
)
OR ( t.hour_from > t.hour_to
AND ( c.tm <= v.hour_from
OR c.tm >= v.hour_to
)
)