如何通过起始时间和结束时间展示出该时间段内的月份,通过点击月份获取当前月的日期
前几天leader对我的报表提了一个新的要求,希望我能有一列来展示每个月的情况,然后通过点击当前月进行钻取再拿到当月每一天的明细。后续问题都不是很难,关键是如何通过起始时间和结束时间获取到当前年月。报表的展示效果如下:http://bbs.fanruan.com/forum.php?mod=image&aid=89863&size=300x300&key=00764c90d8204865&nocache=yes&type=fixnone
89886
通过钻取,获取到详情如下:
89887
后来在查找资料和商量技术支持的前提下找到一种思路,我这边之前写过一个Java的自定义函数,可以通过起始时间和结束时间获取到时间段内的月份,代码如下:
package com.fr.function;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import com.fr.script.AbstractFunction;
public class FRDateFunction extends AbstractFunction{
@Override
public Object run(Object arg0) {
String result = "";
String minDate = arg0.toString();
String maxDate = arg0.toString();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
Calendar min = Calendar.getInstance();
Calendar max = Calendar.getInstance();
try {
min.setTime(sdf.parse(minDate));
min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1);
max.setTime(sdf.parse(maxDate));
max.set(max.get(Calendar.YEAR), max.get(Calendar.MONTH), 2);
Calendar curr = min;
while (curr.before(max)) {
result += sdf.format(curr.getTime()) + ",";
curr.add(Calendar.MONTH, 1);
}
} catch (ParseException e) {
e.printStackTrace();
}
if(result != null && !"".equals(result) && result.endsWith(",")){
result = result.substring(0,result.length() - 1);
}
System.out.println(result);
return result.toString();
}
}
需要的小伙伴可以直接在帆软自定义函数里面编译保存使用。然后在A1单元格里面引用当前的公式FRDateFunction($starttime, $endtime),起始时间和结束时间的按钮名分别叫starttime,endtime,通过引用公式可以获取到一堆被拆分出来的数组如2017-01,2017-02,2017-03,2017-04,2017-05,2017-06,这个时候在B2单元格里面通过公式=split(A1, ",") + "-" + "01",这样通过split切割字符串就可以将这些在一起的字符串通过逗号分隔开,得到2017-01-01的字段,很多人会疑惑我为啥要在公式后面加上01,因为为了实现XXXX年XX月的效果,是需要用到一个format的公式,这个公式需要的是对完整的年月日字段才能进行格式化,format(B2, "yyyy年MM月"),这样就得到了2017年1月的这种形式。
后面的详情页需要通过对点击的月份进行详情钻取,得到本月的日期,本来是打算请教大神去写代码的,后来通过咨询技术支持,在他的点拨下写了一个相对代码来说简单点的公式如下:
if(month($starttime)=month($a1),RANGE(date(year($starttime),month($starttime),day($starttime))
,date(year(DATEINMONTH($starttime,-1)),month(DATEINMONTH($starttime,-1)),day(DATEINMONTH($starttime,-1)))
,1),if(month($endtime)=month($a1),range(date(year($a1),month($a1),1),date(year($endtime),month($endtime),day($endtime)) ,1)
,range(date(year($a1),month($a1),1),date(year($a1),month($a1),day(DATEINMONTH($a1,-1)))
,1)))
这个公式的思路是当起始时间和点击的当前月份相同,就从起始日到起始时间的这个月的最后一天进行一次日期遍历,当结束时间和点击的当前月份相同时,就从结束时间的这个月的一号到结束时间的日期进行一次日期遍历,如果起始时间的月份<点击的当前月份<结束时间的月份,则从一号开始遍历到点击月份的最后一天。
在这个公式里面用到了两个重要的公式,一个是range,这个公式是得把时间转换成yyyy,MM,DD的形式,中间得用逗号隔开。
另外一个是DATEINMONTH公式,这个公式可以通过当月的任何一天得到本月最后一天。
整体过程就是这样了,如果大家有疑问,联系我 qq:476923971
第一次发帖,有啥错误欢迎指正。也希望帆软早日能出一个通过起始时间和结束时间获取当前月份及月份下面对应的日期的自定义函数。
编辑于 2017-12-25 19:25
编辑于 2017-12-25 19:30
编辑于 2017-12-25 19:32