2014-07-14 28 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,我编辑了我的答案,也许新版本更有帮助。 –