帆软中常用的日期函数
背景介绍
在数据分析和报表开发中,日期处理是高频且关键的需求。无论是动态展示近7天销售趋势、计算用户注册时长,还是生成月度/年度对比报表,都离不开对日期数据的灵活操作。帆软(FineReport) 作为企业级报表工具,提供了一系列强大的内置日期函数,帮助开发者高效处理时间相关逻辑。本文将深入解析帆软中常用的日期函数,结合真实场景案例,助你快速掌握核心技巧,提升报表开发效率!
一、帆软日期函数核心作用
- 动态日期生成:自动获取当前时间、指定时间范围。
- 日期计算:计算间隔天数、增减日期、提取年月日等。
- 数据过滤:按日期筛选业务数据(如近30天订单)。
- 报表自动化:实现动态标题(如“2024年7月销售报表”)。
二、常用日期函数详解与案例
1. today() 获取当前日期
- today()即获取当前日期。
today(),返回值为2011-11-11
2. now() 获取当前时间
- now()即获取当前日期与时间。
now(),返回的值2012-06-20 14:55:57
3. year(),month(),day() 获取日期的年、月、日
获取年份:year("2011-11-11"),返回值为2011
获取月份:month("2011-11-11"),返回值为11
获取日期:day("2011-11-11"),返回值为11
4. todate() 将日期格式的字符串转化成日期型
- todate()可以将任何日期形式的数据转化成日期型即:yyyy-MM-dd型数据。
todate("2011/11/11"),返回值为2011-11-11。
todate("2/15/11","MM/dd/yy"),返回值为2011-02-15
5. format() 将日期型数据转化成其他格式的日期形式
- format()可以将日期型数据转化成其他形式的数据。
format("2/15/2011","dd/MM/yyyy"),返回值为15/02/2011
format("2/15/2011","yyyy-MM-dd"),返回值为2011-02-15
6. datedelta() 日期加减
- 当前日期前一天的日期
datedelta(today(),-1),返回值为2011-11-10
注:公式中的-1表示减一天若是正数则表示加相应的天数
7. monthdelta() 月份加减
- 当前日期上一个月的日期
monthdelta(today(),-1),返回值为2011-10-11
8. yeardelta()年份加减
- 当前日期上一年的日期
yeardelta(today(),-1),返回值为2010-11-11
9. dateinmonth() 获取某月的第几天
- 可以通过dateinmonth(date, number)来获取某月的第几天。
dateinmonth(today(),1),返回值为2011-11-01,返回当前月的第一天
dateinmonth(today(),-1),返回值为2011-11-30,返回当前月的最后一天
三、联合使用
参数名为:$date,如当前日期格式为:201506
1. 去年同期
CONCATENATE(YEAR($date,"yyyyMM") - 1, IF(MONTH($date, "yyyyMM") < 10,CONCATENATE(0, MONTH($date, "yyyyMM")), MONTH($date,"yyyyMM")))
2. 去年同期上月
CONCATENATE(YEAR($date, "yyyyMM") - 1, IF(MONTH($date,"yyyyMM") - 1 < 10, CONCATENATE(0, MONTH($date,"yyyyMM") - 1), MONTH($date, "yyyyMM") - 1))
3. 上月
CONCATENATE(YEAR($date, "yyyyMM"), IF(MONTH($date,"yyyyMM") - 1 < 10, CONCATENATE(0, MONTH($date,"yyyyMM") - 1), MONTH($date, "yyyyMM") - 1))
4. 上上月
IF(MONTH($date,"yyyyMM") - 2 > 0,CONCATENATE(YEAR($date, "yyyyMM"), IF(MONTH($date,"yyyyMM") - 2 < 10, CONCATENATE(0, MONTH($date, "yyyyMM")- 2), MONTH($date, "yyyyMM") - 3)),CONCATENATE(YEAR($date, "yyyyMM")-1, IF(MONTH($date,"yyyyMM") -2 + 12 < 10, CONCATENATE(0, MONTH($date, "yyyyMM") -2 + 12), MONTH($date, "yyyyMM") -2 + 12)))
上述代码表示:如果月份减2大于0的话,就正常处理;如果月份减2小于等于0的话,就让年份减1,月份减2的基础上再加上12。这样就能得出正确的日期了。其他运算同理。
注:
格式化当前日期 YEAR($date, "yyyyMM")
格式化当前日期,求出去年年份值 YEAR($date, "yyyyMM") – 1
格式化当前日期,求出月份值 MONTH($date, "yyyyMM")
格式化当前日期,求出上月月份值 MONTH($date, "yyyyMM")-1
格式化当前日期,求出上上月月份值 MONTH($date, "yyyyMM")-2
如果月份小于2位数,也就是10的话,要单独处理月份值:
IF(MONTH($date, "yyyyMM") < 10, CONCATENATE(0,MONTH($date, "yyyyMM")), MONTH($date, "yyyyMM"))
对处理后的年份和月份利用函数 CONCATENATE进行拼接即可。
四、实战场景
场景1:动态报表标题
- 需求:标题自动显示“2024年7月销售报表”。
- 实现:
"报表时间:" + YEAR(TODAY()) + "年" + MONTH(TODAY()) + "月"
场景2:员工工龄计算
- 公式:
DATEDIFF(TODAY(), 入职日期, "y") + "年" +
DATEDIFF(TODAY(), 入职日期, "m") % 12 + "个月"
// 输出:3年5个月
场景3:自动生成最近12个月列表
- 步骤:
- 使用SEQ()生成0~11的序列。
- 循环中计算月份:
DATEADD(TODAY(), -1 * 序列值, "m")
五、避坑指南
- 格式一致性:确保参与计算的日期格式统一(如yyyy-MM-dd)。
- 时区问题:部署时检查服务器时区与业务需求是否匹配。
- 空值处理:使用IFNULL(日期字段, TODAY())避免公式报错。
六、总结
掌握帆软日期函数,能大幅提升报表开发的灵活性与效率。本文涵盖核心函数及3大实战场景,建议结合实际业务需求,举一反三。后续可探索更复杂的函数组合,欢迎来评论区讨论;如WEEKDAY()(星期计算)、DATESUB()(日期差值的高级模式)等,解锁更多报表自动化能力!
码字不易,喜欢请点赞收藏,谢谢!!!😊
参考:https://help.fanruan.com/finereport/edition-view-14580-15.html