当前位置: 首页 > java >正文

power query自定义查询函数(中午休息一小时

KPI 类POWERBI

需求:

Unstuff date & time -货到了               [UNSTUFFING_DATETIME1]
#targeted received date & time.         [TargetedReceivedDateTime]
大部分supplier + 8 working hour.       [WorkingHours]
两个supplier + 4 workinghour.:Armor Asia Imaging Supplies Pte Ltd和Transam Industries Pte Ltd
Working hours:
Mondy - Friday 9AM - 5PM. 12PM - 1PM break
Sat 9AM - 12PM
Sun off
Public holiday off                              Holidays表    

函数:fnCalculateTargetDateTime:

(UnstuffingDateTime as datetime, WorkingHours as number, Holidays as table) as datetime =>
let
    // 判断是否为工作日
    IsWorkingDay = (date as date) =>
        let
            DayOfWeek = Date.DayOfWeek(date, Day.Monday),
            IsHoliday = Table.Contains(Holidays, [HolidayDate = date])
        in
            not IsHoliday and (DayOfWeek <= 5), // 周一至周五且非假期

    
    CalculateTarget = 
        let
            func = (remainingMinutes as number, current as datetime) =>
                let
                    CurrentDate = DateTime.Date(current),
                    CurrentTime = DateTime.Time(current),
                    CurrentYear = Date.Year(CurrentDate),
                    CurrentMonth = Date.Month(CurrentDate),
                    CurrentDay = Date.Day(CurrentDate),
                    IsSaturday = Date.DayOfWeek(CurrentDate, Day.Monday) = 5,
                   
                    MorningSlot = [
                        Start = #datetime(CurrentYear, CurrentMonth, CurrentDay, 9, 0, 0),
                        End = #datetime(CurrentYear, CurrentMonth, CurrentDay, 12, 0, 0)
                    ],
                    AfternoonSlot = [
                        Start = #datetime(CurrentYear, CurrentMonth, CurrentDay, 13, 0, 0),
                        End = #datetime(CurrentYear, CurrentMonth, CurrentDay, 17, 0, 0)
                    ],
                   
                    WorkSlots = if not IsWorkingDay(CurrentDate) then {}
                               else if IsSaturday then {MorningSlot}
                               else {MorningSlot, AfternoonSlot},
                    
                    ProcessSlots = List.Accumulate(
                        WorkSlots,
                        [Remaining = remainingMinutes, Current = current, Done = false],
                        (state, slot) =>
                            if state[Done] or state[Remaining] <= 0 then state
                            else
                                let
                                    SlotStart = if state[Current] > slot[Start] then state[Current] else slot[Start],
                                    AvailableMinutes = if SlotStart >= slot[End] then 0
                                                      else Duration.TotalMinutes(slot[End] - SlotStart),
                                    MinutesToUse = if AvailableMinutes > state[Remaining] 
                                                  then state[Remaining] 
                                                  else AvailableMinutes,
                                    
                                    NewCurrent = SlotStart + #duration(0, 0, MinutesToUse, 0),
                                    NewRemaining = state[Remaining] - MinutesToUse,
                                    IsDone = NewRemaining <= 0
                                in
                                    [Remaining = NewRemaining, Current = NewCurrent, Done = IsDone]
                    ),
                    
                    
                    NextDate = 
                        if ProcessSlots[Done] then ProcessSlots[Current]
                        else @func(
                            ProcessSlots[Remaining],
                            #datetime(
                                Date.Year(Date.AddDays(CurrentDate, 1)),
                                Date.Month(Date.AddDays(CurrentDate, 1)),
                                Date.Day(Date.AddDays(CurrentDate, 1)),
                                9, 0, 0)
                        )
                in
                    NextDate,
            
            InitialRemaining = WorkingHours * 60
        in
            func(InitialRemaining, UnstuffingDateTime)
in
    CalculateTarget

函数调用:

= Table.AddColumn(上一步骤名称, "TargetedReceivedDateTime", each fnCalculateTargetDateTime(
[UNSTUFFING_DATETIME1],  
[WorkingHours],                      
Holidays                
))

http://www.xdnf.cn/news/18663.html

相关文章:

  • 基于Spark的热门旅游景点数据分析系统的设计-django+spider
  • 基于springboot的理商管理平台设计与实现、java/vue/mvc
  • pom.xml 标签整理各个标签的用途和含义
  • 复杂场景鲁棒性突破!陌讯自适应融合算法在厂区越界检测的实战优化​
  • 57 C++ 现代C++编程艺术6-类的内部类
  • DBeaver连接SQL Server集成认证问题解决方案
  • 题解:P13822 「Diligent-OI R2 B」白露为霜_奇偶性_数学归纳_算法竞赛C++
  • 将C++资源管理测试框架整合到GitLab CI/CD的完整实践指南
  • ffmpeg 问答系列-> mux 部分
  • C6.1:发射极偏置放大器
  • 阿里 通义千问 Java23种设计模式
  • IDM 下载失败排查指南:全面解析与解决方案
  • 深入解析 std::enable_if:原理、用法与现代 C++ 实践
  • 编程与数学 02-017 Python 面向对象编程 20课题、迭代器模式
  • 大数据毕业设计选题推荐-基于大数据的丙型肝炎患者数据可视化分析系统-Hadoop-Spark-数据可视化-BigData
  • 深入解析十大经典排序算法原理与实现
  • 室联人形机器人:家政服务任务结构化、技术要点、深入应用FPGA的控制系统框架设计(整合版A)
  • 【运维进阶】高可用和负载均衡技术
  • Django的Serializers与 fastapi 的Pydantic
  • 【R语言】R语言中 rbind() 与 merge() 的区别详解
  • 网络编程-创建TCP协议服务器
  • 疏老师-python训练营-Day54Inception网络及其思考
  • 屏幕类型与信号接口
  • 【KO】前端面试一
  • LLaMA-Factory 中配置文件或命令行里各个参数的含义
  • 如何利用 DeepSeek 提升工作效率
  • 10.Shell脚本修炼手册---脚本的条件测试与比较
  • 国家自然科学基金(国自然基金)申请技巧详解
  • 深度学习入门:神经网络
  • 【2025CVPR-目标检测方向】UniMamba:基于激光雷达的3D目标检测,采用分组高效曼巴语进行统一空间信道表示学习