2017-09-26 113 views
1

我已創建了時間表達式幾個變量,創建基於時間的報告:如何顯示前一個月的最後一天相對於某個日期?

// First of month (Returns 01/09/2017) 
new SimpleDateFormat("MM/dd/yyyy").format(java.util.Date.parse("01/" + MONTH(NOW()) + "/" + YEAR(NOW()))) 

// First of previous month (Returns 01/08/2017) 
new SimpleDateFormat("MM/dd/yyyy").format(java.util.Date.parse("01/" + (MONTH(NOW()) - 1) + "/" + YEAR(NOW()))) 

// Last of month (Returns 30/09/2017) 
new SimpleDateFormat("MM/dd/yyyy").format(java.util.Date.parse(MONTH(NOW()) + "/" + DAYSINMONTH(NOW())+ "/" + YEAR(NOW()))) 

我現在得到上月的最後一天掙扎。我嘗試了類似下面的內容,但這當然不能正常工作,因爲不是所有的月份都有相同的天數。

// Last of previous month (Returns 30/08/2017) 
new SimpleDateFormat("MM/dd/yyyy").format(java.util.Date.parse(
    (MONTH(NOW()) - 1) 
    + "/" + 
    DAYSINMONTH(NOW()) 
    + "/" + 
    YEAR(NOW()) 
)) 

你知道一種檢索上個月最後一天的方法嗎?

參考:http://community.jaspersoft.com/questions/843248/last-day-current-month

+0

我最近通過在select語句中使用SQL實例來實現它。儘管如此,仍然對智能解決方案感興趣 – user2663557

回答

0

我可能已經解決了這個使用Java創建一個靜態類,是以日期爲參數,然後使用Calendar API或類似返回所需的日期的方法,這是如何在java Calendar - Get last day of previous month中做到這一點。

然而,讓有樂趣,只使用碧玉報告

既然我們不能使用日曆API(它返回void),我們需要在org.apache.commons.lang.time.DateUtils回落again我的朋友Tunaki教我。

使用DateUtils我們可以稱之爲第一truncate用一個月(除去天),然後我們addDays -1(-1一天,如果我們在每月的第一個日期,它會給我們上月的最後一天)

DateUtils.addDays(DateUtils.truncate(myDate, Calendar.MONTH),-1); 

JRXML例如

<?xml version="1.0" encoding="UTF-8"?> 
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="DateUtil" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="f288086f-db4e-451f-bf32-e1cce6311a27"> 
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/> 
    <import value="java.util.Calendar"/> 
    <import value="org.apache.commons.lang.time.DateUtils"/> 
    <parameter name="date" class="java.util.Date"> 
     <defaultValueExpression><![CDATA[new Date()]]></defaultValueExpression> 
    </parameter> 
    <queryString> 
     <![CDATA[]]> 
    </queryString> 
    <title> 
     <band height="20" splitType="Stretch"> 
      <textField pattern="MM/dd/yyyy"> 
       <reportElement x="0" y="0" width="220" height="20" uuid="48878c52-5527-4784-a74a-e2d8df65cc55"/> 
       <textFieldExpression><![CDATA[DateUtils.addDays(DateUtils.truncate($P{date}, Calendar.MONTH),-1)]]></textFieldExpression> 
      </textField> 
     </band> 
    </title> 
</jasperReport> 

輸出(有一天我過了這個答案)

result

設計筆記:你應該使用模式來格式化日期,因爲我在我的例子做的,表達不使用SimpleDateFormat,使用模式如果導出例如脫穎而出會給你正確的對象。

相關問題