2011-07-29 30 views
13

Tôi cần thực hiện truy vấn và tham gia với tất cả các ngày trong năm nhưng trong db của tôi không có bảng lịch.
Sau khi google-ing tôi tìm thấy generate_series() trong PostgreSQL. MySQL có bất cứ điều gì tương tự?generate_series() tương đương trong MySQL

bảng thực tế của tôi có một cái gì đó như:

date  qty 
1-1-11 3 
1-1-11 4 
4-1-11 2 
6-1-11 5 

Nhưng truy vấn của tôi đã trở lại:

1-1-11 7 
2-1-11 0 
3-1-11 0 
4-1-11 2 
and so on .. 
+0

Tại sao bạn không thể thực hiện việc này trong lớp logic ứng dụng của mình? – Shef

+3

Nó không phải là giải pháp "đúng" để làm trong logic ứng dụng. Nó tốt hơn, thực sự tốt hơn để làm thông qua sql (nếu có thể). Nếu nó sẽ không thể .. ok, tôi sẽ làm trong logic ứng dụng của tôi ... – stighy

+0

@stighly: Vâng, bạn có thể giải quyết một nửa vấn đề trên MySQL. Nghĩa là, bạn có thể 'GROUP BY date' và' SUM (qty) qty', nhưng tôi không nhớ bất kỳ giải pháp nào trên đỉnh đầu của tôi để thêm hàng cho các chuỗi bị thiếu. Nó tốt hơn để làm điều đó trong logic ứng dụng, nếu một ngày có giá trị qty, hiển thị nó, khác hiển thị 0. – Shef

Trả lời

23

Đây là cách tôi làm điều đó. Nó tạo ra một loạt các ngày từ 2011-01-01-2011/12/31:

select 
    date_format(
     adddate('2011-1-1', @num:[email protected]+1), 
     '%Y-%m-%d' 
    ) date 
from 
    any_table,  
    (select @num:=-1) num 
limit 
    365 

-- use limit 366 for leap years if you're putting this in production 

Yêu cầu duy nhất là số lượng hàng trong any_table phải lớn hơn hoặc bằng với kích thước của phạm vi cần thiết (> = 365 hàng trong ví dụ này). Bạn rất có thể sẽ sử dụng điều này làm truy vấn con của toàn bộ truy vấn, vì vậy trong trường hợp của bạn, any_table có thể là một trong các bảng bạn sử dụng trong truy vấn đó.

+2

Vô cùng hacky, nhưng hoạt động như một say mê. Tôi hoàn toàn sử dụng nó. Cách tốt hơn so với các phương pháp khác tôi thấy. –

+0

Điều này không xảy ra trong những năm nhuận? – Milimetric

+0

@Milimetric No. Nó chỉ xuất ra 365 ngày liên tiếp, nhưng bạn có thể cần 'giới hạn 366' cho năm nhuận. – Karolis

3

phiên bản cải tiến của giải pháp từ @Karolis đảm bảo nó hoạt động cho bất cứ năm (bao gồm cả năm nhuận):

 
select date from (
    select 
     date_format(
     adddate('2011-1-1', @num:[email protected]+1), 
     '%Y-%m-%d' 
    ) date 
    from 
     any_table, 
    (select @num:=-1) num 
    limit 
     366 
) as dt 
where year(date)=2011 
3

tôi đã tìm cách để giải pháp này nhưng không có ngày "mã hóa cứng", và tôi đi lên với cái này hợp lệ cho năm hiện tại (được trợ giúp từ số answers). Xin lưu ý rằng

where year(date)=2011 

là không cần thiết khi lựa chọn đã lọc ngày. Cũng theo cách này, không quan trọng bảng nào (ít nhất là được nêu trước bảng có ít nhất 366 hàng) được sử dụng, vì ngày tháng được "tính toán" trong thời gian chạy.

select date from (
    select 
     date_format(
     adddate(MAKEDATE(year(now()),1), @num:[email protected]+1), 
     '%Y-%m-%d' 
    ) date 
    from 
     your_table, 
    (select @num:=-1) num 
    limit 
     366) as dt 
Các vấn đề liên quan