2014-07-14 34 views
1

如何才能選擇,其中包括日期,可能會錯過一些值來填充,包括所有日期:創建時間範圍表,或Informix的SQL填充空白日期

01.01.1970 | a 
02.01.1970 | b 
04.01.1970 | c 
... 
30.01.1970 | c 

應該變成:

01.01.1970 | a 
02.01.1970 | b 
03.01.1970 | 
04.01.1970 | c 
... 
30.01.1970 | c 

我可以創建一個包含所有日期的臨時表,然後加入結果。這感覺很笨拙。

我無權訪問腳本功能。只有內建功能。 Informix版本是11.5。

編輯:查詢,我用:

SELECT t.create_date, t.content 
    FROM testdata t 
WHERE YEAR(t.create_date) = 1970 
    AND MONTH(t.create_date) = 1 
; 

或本

SELECT t.create_date, t.content 
    FROM testdata t 
WHERE YEAR(t.create_date) = 1970 
; 
+0

你能編輯一個問題並與我們分享您當前的查詢嗎? –

回答

2

它可能會覺得笨拙,但日期表(數據倉庫中的'日期維')是唯一可行的方法。

一個包含從1900到2050的每個日期的表只會運行到55000行,並且無疑會在日期字段上具有唯一索引。假設這張表沒有其他列,它將適合幾百頁。創建一次並忘記它是微不足道的。 Lajos Arpad的解決方案以其自己的方式優雅並且可能有效,但您仍然必須決定它將支持的年限範圍,並在您每次需要執行此操作時運行所有這些嵌套查詢。它是高度不大可能在每次需要時動態創建此表將比​​僅構建一次更有效。不成熟的優化是所有邪惡和所有這些的根源。

隨着時間的推移,您可能會發現日期維度的其他用途。記錄該日是否爲營業日的標誌字段是常見的。

0

您不必爲您的所有日期的記錄,所以你可以生成數據,你需要有union與您的數據,group他們通過create_date並選擇最大的content

select create_date, max(content) from 
((SELECT t.create_date as create_date, t.content as content 
    FROM testdata t 
WHERE YEAR(t.create_date) = 1970 
    AND MONTH(t.create_date) = 1) 
union 
(select '01.01.1970' as create_date, '' as content 
union 
select '01.02.1970' as create_date, '' as content 
union 
select '01.03.1970' as _create_date, '' as content 
union 
select '01.04.1970' as create_date, '' as content)) temp 
group by temp.create_date 
; 

編輯:一個更通用的解決方案:

select create_date, max(content) from 
    ((SELECT t.create_date as create_date, t.content as content 
     FROM testdata t 
    WHERE YEAR(t.create_date) = 1970 
     AND MONTH(t.create_date) = 1) 
    union 
    (select concat('01-', concat(concat(month.m, '-'), year.y)) as create_date, '' 
from 
(select 1970 as y 
union 
select 1971 as y 
union 
select 1972 as y) year, 
(select '01' as m 
union 
select '02' as m 
union 
select '03' as m 
union 
select '04' as m 
union 
select '05' as m 
union 
select '06' as m 
union 
select '07' as m 
union 
select '08' as m 
union 
select '09' as m 
union 
select '10' as m 
union 
select '11' as m 
union 
select '12' as m) month)) temp 
    group by temp.create_date 
    ; 

這一個處理1970年,1971年和1972年,但沒有阻止你處理不同的日期集。

+0

謝謝你,但我正在尋找一種動態的方式來解決問題。我無法將所有可能的日期添加到查詢中。我在我的問題中添加了點,以顯示我的查詢結果更大。 – Kiril

+0

@Kiril,我編輯了我的答案,也許新版本更有幫助。 –