Jasper Reports - 在日期参数中添加一天

时间:2009-11-04 17:10:14

标签: jasper-reports

我正在创建一个包含以下参数的Jasper报告:

  • DATESTART (日期)
  • 日期(日期)

这些参数表示名为 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中做类似的事情?

7 个答案:

答案 0 :(得分:3)

如果您了解法语,则在this thread中会出现同样的问题 (唯一的区别是它是关于增加一个月)

建议的解决方案如下:

SQL

直接在查询中使用SQL语句(如果您的数据源当然是SQL数据源)。 使用MySQL,您可以执行类似

的操作
DATE_ADD($P{DATEEND},INTERVAL 1 DAY);

更多信息:Date and Time Functions (MySQL doc)

JAVA

另一种解决方案是使用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(...,...,...)