如何在Excel的M语言(PowerQuery)中生成B至C列日期区间的所有日期
解决Power Query生成日期区间序列的问题
嘿,我来帮你搞定这个日期生成的需求!用Power Query完全可以轻松实现,不用依赖Excel工作表函数,下面是一步步的具体操作:
步骤1:确保数据是日期类型
首先要确认你的B列和C列已经是日期类型(不是文本)。如果还不是,先在Power Query编辑器里转换:
// 替换YourOriginalTable为你的源表名,Column B/C为实际列名 Source = Table.TransformColumns(YourOriginalTable, { {"Column B", each Date.From(_), type date}, {"Column C", each Date.From(_), type date} })
步骤2:获取起始和结束日期
我们需要从B列取最早的日期,从C列取最晚的日期作为区间边界:
StartDate = List.Min(Table.Column(Source, "Column B")), EndDate = List.Max(Table.Column(Source, "Column C"))
步骤3:生成完整的日期序列
用List.Dates函数生成从起始到结束的所有日期(包含首尾):
// 计算日期总天数,+1是为了包含结束日期 DateCount = Duration.Days(EndDate - StartDate) + 1, // 生成日期列表,每天间隔1天 DateList = List.Dates(StartDate, DateCount, #duration(1, 0, 0, 0))
步骤4:转成表格并格式化日期
把日期列表转换成表格,再将日期格式改成你要的1.1.2018样式:
// 转成表格,列名设为"日期" DateTable = Table.FromList(DateList, Splitter.SplitByNothing(), {"日期"}), // 格式化日期为d.M.yyyy格式(比如1.1.2018) FormattedDateTable = Table.TransformColumns(DateTable, {{"日期", each Date.ToText(_, "d.M.yyyy"), type text}})
完整的M代码示例
把上面的步骤整合起来,完整的查询代码大概是这样的(记得替换成你自己的表名和列名):
let // 加载源数据 Source = Excel.CurrentWorkbook(){[Name="YourOriginalTableName"]}[Content], // 转换B、C列为日期类型(如果需要的话) ConvertToDate = Table.TransformColumns(Source, { {"Column B", each Date.From(_), type date}, {"Column C", each Date.From(_), type date} }), // 获取起始和结束日期 StartDate = List.Min(Table.Column(ConvertToDate, "Column B")), EndDate = List.Max(Table.Column(ConvertToDate, "Column C")), // 生成日期序列 DateCount = Duration.Days(EndDate - StartDate) + 1, DateList = List.Dates(StartDate, DateCount, #duration(1, 0, 0, 0)), // 转成表格并格式化 DateTable = Table.FromList(DateList, Splitter.SplitByNothing(), {"日期"}), FormattedDateTable = Table.TransformColumns(DateTable, {{"日期", each Date.ToText(_, "d.M.yyyy"), type text}}) in FormattedDateTable
这样操作后,你就能得到一个全新的表,里面包含了B列最早日期到C列最晚日期之间的所有日期,而且格式完全符合你的要求~
内容的提问来源于stack exchange,提问作者Omar
相关产品推荐
相关产品推荐

