如何通过起始时间和结束时间展示出该时间段内的月份,通过点击月份获取当前月的日期

楼主
我是社区第90252位番薯,欢迎点我头像关注我哦~
       前几天leader对我的报表提了一个新的要求,希望我能有一列来展示每个月的情况,然后通过点击当前月进行钻取再拿到当月每一天的明细。后续问题都不是很难,关键是如何通过起始时间和结束时间获取到当前年月。报表的展示效果如下:


通过钻取,获取到详情如下:
   

  后来在查找资料和商量技术支持的前提下找到一种思路,我这边之前写过一个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[0].toString();
String maxDate = arg0[1].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  
分享扩散:
参与人数 +1 F豆 +66 理由
兔子酱 + 66 给你点赞!

查看全部评分

沙发
发表于 2017-12-25 21:35:49
楼主辛苦了。这样的知识,能有效整理收集的人已经越来越少了。
板凳
发表于 2017-12-25 21:53:35
来自手机
加油
地板
发表于 2017-12-26 08:24:02
赞一个
5楼
发表于 2017-12-26 09:01:03
获取扩展的年月可以用公式:UNIQUEARRAY(MAPARRAY(RANGE($starttime,$endtime),FORMAT(item,"yyyy-MM-01"))),两个日期控件的返回值类型设置为日期即可,如果是返回字符串,用DATE转换一下
第二个公式,超链接后的报表,把starttime和endtime在单元格里用DATE转换一下,银行两个单元格所在的行,然后公式里取单元格,会简短很多
编辑于 2017-12-26 09:26  
6楼
发表于 2017-12-26 10:38:54
cherishdqy 发表于 2017-12-26 09:01
获取扩展的年月可以用公式:UNIQUEARRAY(MAPARRAY(RANGE($starttime,$endtime),FORMAT(item,"yyyy-MM-01")) ...

您那个扩展年月的公式有试验过吗?请教下那个item是代表啥意思?
7楼
发表于 2017-12-26 11:06:57
guodada 发表于 2017-12-26 10:38
您那个扩展年月的公式有试验过吗?请教下那个item是代表啥意思?

附件示例自己看吧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

10回帖数 2关注人数 7795浏览人数
最后回复于:2018-3-16 17:49

返回顶部 返回列表