我正在创建一个包含以下参数的Jasper报告:
这些参数表示名为 DATECREATED (时间戳)的字段的日期范围,其中包括时间。我希望日期范围是INCLUSIVE,也就是说,如果我过滤“2009年1月1日”到“2009年1月31日”,那么2009年1月31日的任何DATECREATED值(例如“2009年1月31日15:00”) “)将包含在报告中。
当我过去使用Crystal Reports时,我使用DATEADD函数创建了如下所示的过滤器表达式:
{DATECREATED} >= {DATESTART} and {DATECREATED} < DATEADD("d", 1, {DATEEND})
(我意识到这在语法上不正确,但你明白了。)
有没有办法在Jasper Reports中做类似的事情?
答案 0 :(得分:3)
如果您了解法语,则在this thread中会出现同样的问题 (唯一的区别是它是关于增加一个月)
建议的解决方案如下:
直接在查询中使用SQL语句(如果您的数据源当然是SQL数据源)。 使用MySQL,您可以执行类似
的操作DATE_ADD($P{DATEEND},INTERVAL 1 DAY);
更多信息:Date and Time Functions (MySQL doc)
另一种解决方案是使用Java Date object:
我提出了类似的建议:
$P{DATEEND}.setDay($P{DATEEND}.getDay()+1)
但我没有尝试过(这可能是错的)。
您可能需要定义新的日期变量DATEEND_1 使用值表达式:
new Date($P{DATEEND}.getTime() + 24*60*60*1000)
或
new java.util.Date($P{DATEEND}.getTime() + 24*60*60*1000)
在查询V{DATEEND_1}
中使用此新变量。
(我再也不确定)
答案 1 :(得分:1)
试试这个:
new java.util.Date($P{DATEEND}.getTime() + 24*60*60*1000)
答案 2 :(得分:1)
另一个选择是使用与最新版本捆绑在一起的Groovy SDK。
new Date().plus(1) //Today plus one day = tomorrow.
或者更完整 - 添加两个参数DATESTART和DATEEND,并将默认表达式设置为上面的代码。然后在您的查询中将以下内容添加到where子句:
DATECREATED >= $P{DATESTART} and DATECREATED < $P{DATEEND}
或取决于您的SQL变体。
DATECREATED BETWEEN $P{DATESTART} AND $P{DATEEND}
答案 3 :(得分:1)
假设您有一个参数PARAM1
,并且您希望将366天添加到param1,那么您可以按照以下方式执行此操作
1)声明另一个参数$P{finalDate}
2)以下代码$P{finalDate}
作为默认值表达式
new Date($F{PARAM1}.getTime() + 366L*24*60*60*1000)
别忘了在366之后放L。没有放L,它可能无法正常工作,可能无法给出准确的日期。
它将为PARAM1增加366天
答案 4 :(得分:1)
我们已经构建了一个静态日期相关函数库,可以像这样使用:
DateUtil.add(NOW(), 0, 0, 1)
上面会告诉你未来一天的日期(参数是年,月,日)。 JasperReports直接支持DATE_ADD函数会很不错。听起来像是等待提交的补丁。
答案 5 :(得分:1)
DAYSINMONTH($P{Date}) >= (DAY($P{Date})+ 1)
?
DATE(YEAR($P{Date}),MONTH($P{Date}),DAY($P{Date})+1)
:
((MONTH($P{Date}) + 1) > 12) ? DATE(YEAR($P{Date}) + 1,1,1) : DATE(YEAR($P{Date}),MONTH($P{Date}) +1 ,1)
我很抱歉看到这篇文章,但我认为我应该分享这个作为上面发布的选项的另一种选择。您只需要将所有$P{Date}
更改为您的参数!
答案 6 :(得分:0)
您可以创建一个类来帮助您,它有一个静态方法来处理您的参数(或通过添加静态方法来修改类JasperUtils)。这样你就可以让amethod返回一个布尔值,它将完全像你需要的过滤器一样。
package com.package_name.utils;
public class JasperUtils2 {
public static Boolean filterDate(Date dateStart, Date dateEnd, Date dateCreated) {
if (dateCreated.compareTo(dateStart) < 0) return false; // dateCreated is greater or
// equal to dateStart
if (dateCreated.compareTo(dateEnd) > 0) return false; // dateCreated is smaller or
// equal to dateEnd
// you can combine the two conditions into one. I wrote it like this to be more obvious
}
}
要使用此方法,您需要导入创建的类(编辑 - &gt;报告导入指令 - &gt;新导入----对于不同版本的iReport,这可能会有所不同)。然后,您可以以静态方式使用该方法:
JasperUtils2.filterDate(...,...,...)