Oracle DB Report Builder如何计算物料库存存放总天数
方案可行性判断
你提出的计算逻辑完全可行,是库存类报表计算物料在库时长的通用标准方案:以物料对应批次的入库日期为计算起点,以报表运行时选定的目标统计日期为计算终点,计算两个日期的间隔天数,完全匹配你举的「2022年7月5日入库、统计日期为2022年7月7日时在库时长为2天」的示例需求。
具体实现方法
你只需要在原有查询语句的SELECT字段列表中,新增一个日期差计算字段即可。注意不同数据库的日期计算函数存在差异,根据你实际使用的数据库选择对应写法即可,其中@报表查询日期替换为你报表本身已经在使用的查询日期参数:
- MySQL/MariaDB 环境:使用
DATEDIFF函数,注意统计日期作为第一个参数传入,避免结果为负
SELECT MVT.INVT_LEV1, MVT.INVT_LEV2, MVT.INVT_LEV3, MVT.INVT_LEV4, INVT_ORG_RECD_DATE, DATEDIFF(@报表查询日期, INVT_ORG_RECD_DATE) AS 在库天数 FROM M_INVT
如果INVT_ORG_RECD_DATE字段存储的是你举例的07/05/22这类MM/DD/YY格式字符串,而非标准日期类型,需要先做类型转换,将上述语句中的INVT_ORG_RECD_DATE替换为STR_TO_DATE(INVT_ORG_RECD_DATE, '%m/%d/%y')即可。
- SQL Server 环境:使用
DATEDIFF函数,指定日期间隔单位为天
SELECT MVT.INVT_LEV1, MVT.INVT_LEV2, MVT.INVT_LEV3, MVT.INVT_LEV4, INVT_ORG_RECD_DATE, DATEDIFF(day, INVT_ORG_RECD_DATE, @报表查询日期) AS 在库天数 FROM M_INVT
字符串格式的日期可以用CONVERT(DATE, INVT_ORG_RECD_DATE, 1)做类型转换。
- Oracle 环境:日期类型字段直接做减法即可得到天数差
SELECT MVT.INVT_LEV1, MVT.INVT_LEV2, MVT.INVT_LEV3, MVT.INVT_LEV4, INVT_ORG_RECD_DATE, (:报表查询日期 - INVT_ORG_RECD_DATE) AS 在库天数 FROM M_INVT
字符串格式的日期可以用TO_DATE(INVT_ORG_RECD_DATE, 'MM/DD/YY')做类型转换。
落地注意事项
- 建议增加异常值处理逻辑,过滤入库日期晚于统计日期的脏数据,避免出现负数在库天数,比如MySQL环境可以写为
GREATEST(DATEDIFF(@报表查询日期, INVT_ORG_RECD_DATE), 0),将异常值统一显示为0。 - 如果你使用的是BI可视化工具(如PowerBI、Tableau、帆软等)搭建报表,不需要修改底层SQL,可以直接在报表数据集层新建计算字段,复用报表自带的查询日期参数做日期差计算,配置效率更高。
- 如果你的报表是按批次核算库存结存,需要确认
INVT_ORG_RECD_DATE取的是当前结存批次对应的原始入库日期,而非物料最新入库日期,否则会导致在库时长计算结果偏短。
内容的提问来源于stack exchange,提问作者CHRiSTiANM
相关产品推荐
相关产品推荐

