2011-07-29 43 views
13

我需要做一個查詢並加入一年中的所有日子,但在我的數據庫中沒有日曆表。
谷歌後我在PostgreSQL中發現generate_series()。 MySQL有類似的東西嗎?在MySQL中相當於generate_series()

我的實際表有這樣的:

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

但我的查詢必須返回:

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

爲什麼你不能在你的應用邏輯層做到這一點? – Shef

+3

這不是在應用邏輯中做「正確」的解決方案。通過sql做的更好,真的更好(如果可能的話)。如果它不可能..好吧,我會在我的應用程序邏輯... – stighy

+0

@stighly:那麼,你可以解決MySQL的一半問題。也就是說,你可以用'GROUP BY date'和'SUM(qty)qty',但我不記得任何解決方案,我的頭頂上添加缺失序列的行。最好是在應用邏輯中做,如果日期有一個數值,顯示它,否則顯示0. – Shef

回答

23

這是我要做的事。它創建從2011-01-012011-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 

唯一的要求是該行中的數字any_table應大於或等於該所需範圍的大小(在本例中> = 365行)。您很可能將此用作整個查詢的子查詢,因此您的案例any_table可以是您在該查詢中使用的表格之一。

+2

非常哈克,但作品像一個魅力。我完全使用它。比我看到的其他方法更好。 –

+0

在閏年期間這不會中斷嗎? – Milimetric

+0

@Milimetric編號它只連續輸出365天,但您可能需要閏年限制366。 – Karolis

3

增強從@Karolis解決方案版本,以確保它適用於任何一年(包括閏年):

 
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

我一直在尋找這種解決方案,但沒有「硬編碼」的日期,我來到行動這一年有效(從answers得到幫助)。 請注意:如選擇已篩選日期不需要

where year(date)=2011 

。同樣這樣,使用哪個表(至少在表至少有366行之前聲明)並不重要,因爲日期在運行時是「計算的」。

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