我们数据库有很多关于时间的字段,都是以DA TE格式存储的。
这些DA TE的数据中有些是到年月日,有些是具体到时分秒的. 当我们将表导入BIEE物理层的时候,发现含有时分秒的数据都会默认转变为timestamp 类型.
为什么biee 要强制转换为timestamp 类型,我还不得而知,但是在报表开发中的确带来了一些问题.
问题之一:我们在Administrator中创建过一些变量,希望给这些变量赋值为前一天或前一周这样的动态的时间.以便应用在报表提示中固定查询之前一段时间的数据.
在变量的定义中使用了select trunc(sysdate)-1 from dual 这样的写法. 结果发现,转换成的sql 语句是这样的trade_day>TIMESTAMP ‘2008-02-19 00:00:00′. BIEE将时间格式都变为TIMESTAMP型了.
而我们这个表由于数据量非常大,按照date类型日期进行了分区.现在由于条件日期是TIMESTAMP型,这样一来,查询语句就不能使用现成的分区,查询速度变的很慢很糟糕.
如何让查询中日期条件不要转换为TIMESTAMP格式呢,在多次试验后发现,使用biee提供的函数CURRENT_DA TE,将变量的写法改为CURRENT_DA TE - 1 ,则查询语句就成了trade_day>TO_DA TE ‘2007-01-01’. 几秒钟之内就查询出了数据.
如果查询提示中不事先设定变量,而是接收用户前端传过来的日期条件,则查询语句没有这个问题.
问题二:我们有不少查询是要用明细数据表将时间按天进行group by 来做汇总计算的, 我们在逻辑层中建立了一个‘天‘的实体,在表达式定义中使用
trunc(trade_day)的写法希望截取到天, 写法却不被BIEE识别.
我们试着将物理层中的trade_day 这列改为date类形,但发现biee并没有根据这个设置做任何转换, group by 语句还是对含有时分秒的数据进行group by
反复尝试,碰了很多钉子后,发现在逻辑表中‘天‘这个实体的表达式中使用CAST(ade_day AS DATE ) 这种BIEE自带函数的写法,将日期截取到天,biee生成的查询语句就按照我们想象的成为group by trunc(trade_day)了.
trunc函数使用时间这个问题还有其他的解决方法,比如在物理层建立一个sql类型的表,用将sql语句的结果映射成一个表的方式.这样,在sql中就可以使用oracle函数对字段进行转换, 例如trunc. 不过,这种方法在报表中生成的sql并不够优化.
或者另一种方法是通过物理层将维表和事实表的时间字段建立关系的时候选择复杂关系。然后通过维表的天来聚合统计数据.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论