Excel或者Power BI经常需要用到日期表,每次处理会比较麻烦,分享一个经常使用的自定义函数,可以输入起止时间自动生成连续的日期表,包括年、月、日、星期、年月、年周、中文月份名称、自定义月(区分当月上月方便设置环比),是否同期等等

自定义函数

(StartDate as date,EndDate as date)=>let
    // 参数设置 - 根据需要设置日期范围
    // StartDate = #date(2020, 1, 1),
    // EndDate = #date(2024, 12, 31),
    // 其他参数
    this_ym=Date.ToText(EndDate,"yyyy年MM月"),
    last_m=Date.AddMonths(EndDate,-1),
    last_ym=Date.ToText(last_m,"yyyy年MM月"),
    max_day= Date.Day(EndDate),
    
    // 生成日期序列
    DateList = List.Dates(StartDate, Duration.Days(EndDate - StartDate) + 1, #duration(1,0,0,0)),
    // 转换为表格
    转换为表格 = Table.FromList(DateList, Splitter.SplitByNothing(), {"日期"}),
    更改类型 = Table.TransformColumnTypes(转换为表格,{{"日期", type date}}),
    // 添加年份列
    添加年份 = Table.AddColumn(更改类型, "年份", each Date.Year([日期]), Int64.Type),
    // 添加月份列
    添加月份 = Table.AddColumn(添加年份, "月份", each Date.Month([日期]), Int64.Type),
    // 添加日列
    添加日 = Table.AddColumn(添加月份, "日", each Date.Day([日期]), Int64.Type),
    // 添加年月列
    添加年月 = Table.AddColumn(添加日, "年月", each Date.ToText([日期],"yyyy年MM月"), type text),
    // 添加年周列
    添加年周 = Table.AddColumn(添加年月, "年周", each Text.From([年份]) & "年" & 
        Text.PadStart(Text.From(Date.WeekOfYear([日期])),2, "0") & "周", type text), 
    // 添加月份名称
    添加月份名称 = Table.AddColumn(添加年周, "月份名称", each Date.MonthName([日期]), type text),
    // 添加星期名称
    添加星期名称 = Table.AddColumn(添加月份名称, "星期名称", each Date.ToText([日期], "ddd"), type text),
    // 添加是否工作日
    添加是否工作日 = Table.AddColumn(添加星期名称, "是否工作日", each if Date.DayOfWeek([日期], Day.Monday) < 5 then "是" else "否", type text),
    添加自定义月 = Table.AddColumn(添加是否工作日, "自定义月", each if [年月] = this_ym then "当月" else if [年月] = last_ym then "上月" else [年月],type text),
    添加同期 = Table.AddColumn(添加自定义月, "是否同期", each if [日] <= max_day then "同期" else "其他",type text)

in
    添加同期

使用方法

打开Power Query 高级编辑器,新建空白查询,复制以上代码,添加即可
64162-5efj0jtsaar.png