最新历史版本 :报表端-公式实现根据时间间隔取数 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 概述编辑

1.1 问题描述

当数据库中某张表有时间字段,且几乎每分每秒都会有一条数据生成,为减少报表显示数据量,可以通过时间间隔来筛选数据,仅显示部分数据。

例如:在「开始时间」和「结束时间」控件内里面输入时间查询起始&结束范围,在 时间间隔 控件里输入间隔数 3600,按 3600秒(1小时)时间间隔筛选数据,如下图所示:

1.2 实现思路

通过帆软内置的函数运算,返回符合条件的内容扩展显示。

公式参考:=MAPARRAY(range(DATETONUMBER($starttime) / 1000, DATETONUMBER($endtime) / 1000, $jg), format(TODATE(item * 1000), "yyyy-MM-dd HH:mm:ss"))

2. 示例编辑

2.1 新建报表

新建「开始时间」和「结束时间」控件,控件名分别是「starttime」「endtime」,返回值类型为时间型(yyyy-MM-dd HH:mm:ss),时间间隔控件名 jg

如图所示:

2.2 单元格公式设置

在 A1 单元格输入公式:=MAPARRAY(range(DATETONUMBER($starttime) / 1000, DATETONUMBER($endtime) / 1000, $jg), format(TODATE(item * 1000), "yyyy-MM-dd HH:mm:ss"))设置扩展方向为纵向,如图所示:

公式说明:

先将「开始时间&结束时间」通过 DATETONUMBER() 函数转换成时间戳格式(毫秒级),在将结果除以 1000 (精确到秒级)后,用range() 以固定的时间间隔(数字)展示过滤出麻烦条件的值,最后将结果以“yyyy-MM-dd HH:mm:ss”返回。

函数
解释示例
DATETONUMBER(date)返回自1970年1月1日00:00:00GMT经过的毫秒数DATETONUMBER("2008-08-08")等于1218124800000
RANGE(from,to,step)函数表示从整数from开始,以step为每一步的大小,直到整数to的一个数字序列。RANGE(0,5,1)返回[0,1,2,3,4,5]
MAPARRAY(array,fn)把一个数组中的项目转换到另一个数组中MAPARRAY([3,4,2,3,6,8,7],item!=3)等于[false,true,true,false,true,true,true]

2.3 效果预览

保存设置,分页预览。

2.3.1 PC 端

详情参见本文 1.1 节。

2.3.2 移动端

如下图所示: