BIRT报告:两个日期之间的参数

时间:2014-02-07 14:47:11

标签: oracle birt

我收到了一份报告,我正在用BIRT写一篇关于Oracle数据库的文章:

表:

tranx_no (string)
type (string)
description (string)
amount (number(14,2))
date (date)

在BIRT中查询:

SELECT tranx_no, type, description, amount
FROM tranx_table
WHERE date BETWEEN ? AND ?

如果我只是在参数中做了简单日期(02-01-2014和02-14-2014),它会错过在14日(午夜停止)发生的事情。我已经尝试将时间连接到日期参数

WHERE date BETWEEN ? || '12:00:00 AM' AND ? || '11:59:59 PM'

并收到ORA 01843错误。我也尝试使用to_date

进行投射

WHERE date BETWEEN TO_DATE(? || '12:00:00 AM', 'MM-DD-YYYY HH:MI:SS AM') AND TO_DATE(? || '11:59:59 PM', 'MM-DD-YYYY HH:MI:SS AM')

也没有欢乐。 ORA 01847错误发生在那个。

想法?我知道可能有一些我没想到的简单,但谷歌没有帮助。我想编辑查询,而不是更改表单正面的日期条目。

感谢。

2 个答案:

答案 0 :(得分:1)

使用BIRT正确处理DATE可能会非常棘手。

我建议始终使用VARCHAR2传递DATE参数(对于报表参数以及查询参数)。始终验证参数的数据类型。

在您的SQL中,始终使用带有显式日期格式的TO_DATE / TO_CHAR - 否则结果将取决于区域设置。

接下来,请确保在查询中使用之前将用户输入的值调整为已知的日期格式。例如,在德国,常用SQL日期格式DD.MM.YYYY HH24:MI:SS。

您可以创建一个实用程序功能,自动添加缺少的部分(例如时间)。在此函数中使用另一个参数来指定它是“from”日期(添加00:00:00)还是“to”日期(添加23:59:59)。

OTOH如果用户界面强制用户输入一个没有时间的来自的日期(比如你的例子中的'MM-DD-YYYY'格式),你可以只编码

WHERE (date >= to_date(?, 'MM-DD-YYYY') and date < to_date(?, 'MM-DD-YYYY') + 1)

注意&lt;的使用而不是&lt; =。

这是有效的,因为如果格式掩码中没有指定时间,则隐含00:00:00(以HH24:MI:SS格式)。

答案 1 :(得分:0)

正如您所指出的那样,开始日期不是问题,因为它从开始日期的00:00:00开始。如果你的参数是一个文本框,你的用户可以输入02-01-2014 08:00:00从2月1日上午8点开始获得结果。

请注意,我的日期格式为年份,而您的日期格式为年份

对于结束日期,我使用文本框参数作为我的默认值

//Creates a date for one second before midnight of the current date,
//which is properly formatted to use as an end date in quires (for my data)
// Note that a custom date format (yyyy-MM-dd HH:mm:ss) is required for proper display in pop-up GUI

var T; T = BirtDateTime.addDay(BirtDateTime.today(),1);
var Y; Y = BirtDateTime.year(T);
var M; M = BirtDateTime.month(T);
var D; D = BirtDateTime.day(T);

{
Y +"-"
+ M +"-"
+ D +" "
+"00:00:00"
}

我也使用这个帮助文本

Enter date as YYYY-MM-DD. For example, 2013-3-14

添加此提示文字

End Date (YYYY-MM-DD), if time is blank will default to 00:00:00