【问题标题】:Jasper Reports - Add one day to a Date ParameterJasper Reports - 将一天添加到日期参数
【发布时间】:2009-11-04 17:10:13
【问题描述】:

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

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

这些参数指示名为 DATECREATED(时间戳)的字段的日期范围,其中包括时间。我希望日期范围是包容性的,也就是说,如果我过滤“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 中做类似的事情?

【问题讨论】:

  • 请注意,有一个 EDATE 函数可以将 数添加到日期,但似乎没有类似的函数来增加天数。

标签: jasper-reports


【解决方案1】:

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

建议的解决方案如下:

SQL

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

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

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

JAVA

另一种解决方案是使用Date object的Java可能:

我提出了类似的建议:

$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】:

    试试这个:

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

    【讨论】:

      【解决方案3】:

      另一种选择是使用与最新版本捆绑在一起的 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}
      

      【讨论】:

      • 使用 Groovy 比使用原生 java 日期函数要容易得多!
      • 我试过了,它说“方法 plus(int) 未定义日期类型”
      【解决方案4】:

      假设你有一个参数PARAM1,你想给param1加上366天,那么你可以通过下面的方式来做

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

      2) 如下代码,$P{finalDate} 作为默认值表达式

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

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

      它将为 PARAM1 增加 366 天

      【讨论】:

        【解决方案5】:

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

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

        上面的内容会为您提供未来某一天的日期(参数是年、月、日)。 JasperReports 直接支持 DATE_ADD 函数会很好。听起来像是一个等待提交的补丁。

        【讨论】:

          【解决方案6】:
          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】:

            您可以创建一个类来帮助您,它有一个静态方法来处理您的参数(或通过添加静态方法来修改 JasperUtils 类)。这样,您可以让方法返回一个布尔值,该值将完全作为您需要的过滤器。

            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
              }
            }
            

            要使用此方法,您需要导入创建的类(Edit -> Report import directives -> new import ----这可能因iReport的不同版本而异)。然后,您可以以静态方式使用该方法:

            JasperUtils2.filterDate(..., ..., ...)

            【讨论】:

              猜你喜欢
              • 2023-03-06
              • 2011-01-20
              • 2010-10-08
              • 1970-01-01
              • 1970-01-01
              • 2023-03-09
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多