2012-09-26 14 views
6

Tôi có Bảng MySQL có một cột ngày giờ. Tôi muốn ngăn chặn rằng tập lệnh PHP nhận được nhiều dữ liệu. Vì vậy, tôi đang tìm kiếm một giải pháp mà một truy vấn MySql chỉ chọn các hàng có khoảng cách là 1 phút hoặc bất cứ điều gì. là có một cái gì đó đơn giản hoặc tôi phải mã một vòng lặp với một truy vấn mysql mới mỗi lần.Truy vấn MySQL: nhận dữ liệu trong khoảng thời gian cụ thể

Example 
timestamp 
2012-09-25 00:00:00--> 
2012-09-25 00:00:50 
2012-09-25 00:01:23 
2012-09-25 00:01:30--> 
2012-09-25 00:02:33 
2012-09-25 00:02:40 
2012-09-25 00:03:01-->i want those 

cảm ơn trước

+2

Tôi không hiểu tiêu chí, tại sao bạn muốn những tiêu chí đó? – CrazyCasta

+0

Bạn muốn chọn từng hàng? đúng? –

+0

nó chỉ là một ví dụ. Tôi chỉ không muốn tất cả các giá trị trong thời gian 00:01:00 đến 00:02:00, một là đủ. trong bảng thực của tôi có ví dụ 10 giá trị trong khoảng thời gian 1 phút; để giảm lượng dữ liệu tôi chỉ muốn chọn một giá trị. có thể là cao nhất. – simmi91

Trả lời

0

WHERE timestamp LIKE '%:30:00%' sẽ giúp bạn có được mỗi 30 giây ..

Nhưng điều này sẽ chỉ làm việc nếu bạn có đồng phục entries..if timestamps của bạn không tất cả đều chấm dứt .. bạn' sẽ cần cho chúng tôi biết.

EDIT

Tôi nghĩ rằng bạn có thể tìm kiếm này:

How do you select every n-th row from mysql

+0

nếu không có gì giống như 30 trong một khoảng thời gian? – nawfal

+0

đó là vấn đề: P – simmi91

+0

Ahh ... Tôi thấy:/ –

1

Hãy thử điều này

SET @time := '1000-01-01 00:00:00'; 
SET @interval := 60; 

SELECT colDate 
FROM table 
WHERE TIMESTAMPDIFF(SECOND, @time, colDate) >= @interval 
    AND @time := colDate 

Làm thế nào nó hoạt động.

@interval là chênh lệch thời gian mong muốn giữa colDate hiện tại và trước đó. Tham số đầu tiên trong TIMESTAMPDIFF xác định đơn vị thời gian mà khoảng thời gian sẽ sử dụng. ví dụ: SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER hoặc YEAR.

@time theo dõi colDate trước đó và được so sánh với hàng hiện tại. Nếu sự khác biệt giữa colDate trước đó và hiện tại bằng hoặc lớn hơn khoảng thời gian, nó được bao gồm.

+0

tôi sẽ cố gắng đó và trả lời cho dù nó làm việc – simmi91

+0

... hoặc bạn sẽ ... :) –

1

Hãy thử điều này:

SELECT create_time 
FROM timeTable 
WHERE create_time 
IN (

SELECT min(create_time) 
FROM timeTable 
GROUP BY FROM_UNIXTIME(UNIX_TIMESTAMP(create_time) - MOD(UNIX_TIMESTAMP(create_time) , 60)); 

Cách hoạt động:

i) Nhóm các bảng bằng cách datetime làm tròn đến khoảng thời gian, 1 phút (60 giây) ở đây.

ii) Nhận hàng trên cùng từ mỗi nhóm.

Đây có thể là tiêu chí lấy mẫu tốt cho dữ liệu của bạn. Truy vấn này có thể được tối ưu hóa rất nhiều trên các điểm sau:

i) Đặt mệnh đề where cho ngày = REQUIRED DATE, sau đó thực hiện các thao tác khác trên giờ + phút thay vì toàn bộ ngày giờ.

ii) Nếu khoảng thời gian của bạn là 1 phút, thì chuỗi con dấu thời gian hoặc date_format cũng có thể được thử để làm tròn nó thành phút gần nhất.

ví dụ:

SELECT create_time 
FROM timeTable 
WHERE create_time 
IN (

SELECT min(create_time) 
FROM timeTable 
GROUP BY DATE_FORMAT(`create_time` , 'Y-M-D %H:%i') 
); 
Các vấn đề liên quan