代码之家  ›  专栏  ›  技术社区  ›  Templar

Jasper Reports-向日期参数添加一天

  •  2
  • Templar  · 技术社区  · 15 年前

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

    • 数据艺术 (日期)
    • 日期结束 (日期)

    这些参数表示名为 数据化的 (时间戳)包括时间。我希望日期范围包含在内,也就是说,如果我将“2009年1月1日”筛选为“2009年1月31日”,则2009年1月31日的任何日期创建值(例如“2009年1月31日15:00”)都将包含在报告中。

    当我在过去使用Crystal Reports时,我使用了dateadd函数来创建如下的筛选表达式:

    {DATECREATED} >= {DATESTART} and {DATECREATED} < DATEADD("d", 1, {DATEEND})
    

    (我知道这在语法上是不正确的,但你明白了。)

    在Jasper报告中有没有类似的方法?

    7 回复  |  直到 10 年前
        1
  •  3
  •   Jmini Peter Kriens    15 年前

    如果你懂法语,也会问同样的问题 this thread (唯一的区别是增加一个月)

    建议的解决方案如下:

    SQL

    直接在查询中使用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} .

    (我也不确定)

        2
  •  1
  •   Erik    14 年前

    另一种选择是使用与最新版本捆绑在一起的groovy SDK。

    new Date().plus(1) //Today plus one day = tomorrow.
    

    或者更完整-添加两个参数datestart和datend,并将默认表达式设置为上面的代码。然后在查询中将以下内容添加到WHERE子句中:

    DATECREATED >= $P{DATESTART} and DATECREATED < $P{DATEEND}
    

    或者取决于您的SQL变量。

    DATECREATED BETWEEN $P{DATESTART} AND $P{DATEEND}
    
        3
  •  1
  •   Sam Saffron James Allen    14 年前

    试试这个:

    new java.util.Date($P{DATEEND}.getTime() + 24*60*60*1000)

        4
  •  1
  •   Sirko    12 年前

    假设您有一个参数 PARAM1 你想增加366天的参数1,然后你可以这样做

    1)声明另一个参数say $P{finalDate}

    2)代码如下 $p{FieldDe} 作为默认值表达式

    new Date($F{PARAM1}.getTime() + 366L*24*60*60*1000)
    

    别忘了把l放在366之后。如果不加l,可能无法正常工作,也可能无法给出准确的日期。

    它将为参数1增加366天

        5
  •  1
  •   Christopher Schultz    10 年前

    我们已经构建了一个静态日期相关函数库,可以这样使用:

    DateUtil.add(NOW(), 0, 0, 1)
    

    上面会给你一个未来某天的日期(参数是年、月、日)。如果JasperReports直接支持日期添加功能,那就太好了。听起来像是一个等待提交的补丁。

        6
  •  1
  •   Brandon    10 年前
    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} 成为你的参数!

        7
  •  0
  •   Jenny Smith    15 年前

    您可以创建一个类来帮助您,该类有一个处理参数的静态方法(或者通过添加静态方法来修改类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
      }
    }
    

    要使用此方法,需要导入创建的类(编辑->报表导入指令->新导入----这可能因iReport的不同版本而异)。然后,您可以以静态方式使用该方法:

    jasperutils2.filterdate(…,…,……)