我收到了一份报告,我正在用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错误发生在那个。
想法?我知道可能有一些我没想到的简单,但谷歌没有帮助。我想编辑查询,而不是更改表单正面的日期条目。
感谢。
答案 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