我需要做一個查詢並加入一年中的所有日子,但在我的數據庫中沒有日曆表。
谷歌後我在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 ..
我需要做一個查詢並加入一年中的所有日子,但在我的數據庫中沒有日曆表。
谷歌後我在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 ..
這是我要做的事。它創建從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
唯一的要求是該行中的數字any_table應大於或等於該所需範圍的大小(在本例中> = 365行)。您很可能將此用作整個查詢的子查詢,因此您的案例any_table可以是您在該查詢中使用的表格之一。
非常哈克,但作品像一個魅力。我完全使用它。比我看到的其他方法更好。 –
在閏年期間這不會中斷嗎? – Milimetric
@Milimetric編號它只連續輸出365天,但您可能需要閏年限制366。 – Karolis
增強從@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
我一直在尋找這種解決方案,但沒有「硬編碼」的日期,我來到行動這一年有效(從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
爲什麼你不能在你的應用邏輯層做到這一點? – Shef
這不是在應用邏輯中做「正確」的解決方案。通過sql做的更好,真的更好(如果可能的話)。如果它不可能..好吧,我會在我的應用程序邏輯... – stighy
@stighly:那麼,你可以解決MySQL的一半問題。也就是說,你可以用'GROUP BY date'和'SUM(qty)qty',但我不記得任何解決方案,我的頭頂上添加缺失序列的行。最好是在應用邏輯中做,如果日期有一個數值,顯示它,否則顯示0. – Shef