2010-09-14 40 views
6

Tôi có một bảng cơ sở dữ liệu mà trông giống như sau:MySQL: Tuần phạm vi ngày từ số tuần trong một truy vấn

| id   | clock   | info 
---------------------------------------------- 
| 1   | 1262556754 | some info 
| 2   | 1262556230 | some other info 
| 3   | 1262556988 | and another 
| 4   | 1262555678 | and some more 

Nó chứa các bản ghi log và một dấu thời gian unix, khi đăng nhập này đã được viết. Những gì tôi cần, là để có được một báo cáo hàng tuần, về có bao nhiêu hồ sơ đăng nhập đã có trong mỗi tuần. Đây là một câu hỏi mà tôi đã viết:

SELECT 
    DATE_FORMAT(FROM_UNIXTIME(clock), "%U") AS week 
count(*) as cnt 
FROM logs 
WHERE DATE_FORMAT(FROM_UNIXTIME(clock), "%Y") = '2010' 
GROUP BY week 

này đưa ra một kết quả như thế này:

| week  | cnt 
------------------------------- 
| 1   | 55 
| 2   | 134 
| 4   | 765 
| 20   | 65 

Tuyệt vời! Nhưng những gì tôi muốn thấy, là một phạm vi ngày như 08 Feb 2010 00:00 - 15 Feb 2010 00:00, vì vậy tập hợp kết quả sẽ trông như thế này:

| day_start   | day_end   | cnt 
--------------------------------------------------------- 
| 08 Feb 2010 00:00 | 15 Feb 2010 00:00 | 55 
| 15 Feb 2010 00:00 | 22 Feb 2010 00:00 | 76 
| 22 Feb 2010 00:00 | 01 Mar 2010 00:00 | 756 

Có cách nào để làm điều này?

+1

Cách tiếp cận đó sẽ không hoạt động tốt nếu bạn có dữ liệu từ các năm khác nhau trong cùng một bảng - '% U' cho số tuần (nơi Chủ nhật là ngày đầu tiên của tuần) - ngày chủ nhật đầu tiên trong năm 2009 sẽ là 1, giống như ngày chủ nhật đầu tiên trong năm 2010. Bạn có thể cần một cách tiếp cận khác. Hãy xem http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function%5Fyearweek –

+0

Báo cáo của tôi là năm cụ thể, tôi đã chỉnh sửa câu hỏi –

Trả lời

6

Sử dụng STR_TO_DATE('201008 Monday', '%X%V %W'); để có được ngày thích hợp như 2010-02-22 sau đó sử dụng DATE_FORMAT để nhận định dạng bạn cần.

3

Nếu cột "tuần" đó lưu trữ số của một tuần nhất định trong một năm, bạn có thể chỉ cần chuyển đổi nó thành chuỗi ngày bằng cách sử dụng hàm makedate.

ví dụ:

select makedate(2010, week * 7); 

Nó sẽ làm việc, cho rằng báo cáo của bạn là năm cụ thể. Chúc mừng

+1

Tôi có một số dữ liệu, trong đó chúng ta có một cột load_date. Bây giờ tôi muốn chuyển đổi ngày thành tuần. Giả sử load_date là từ ** 2013-01-01 đến 2013-01-07 **. Nó sẽ trả lại thành tuần1 và từ ** 2013-01-08 đến 2013-01-15 **. Nó sẽ trả về kết quả như tuần 2 –

Các vấn đề liên quan