在工作中常常会遇到不规范的日期,当需要处理与时间相关的问题(比如,时间的区间匹配)就需要把文本型的日期转化为真正的日期(或者整数型日期),否则就会引发错误,因为Power Query不像Excel或者Power Pivot那样会自动为数据进行转换。以下为数种常见的转换(示例日期为2020年01月31日):
情景一(数字转日期):
let
Soluntion = Date.From( Number.ToText( 20200131, "0000-00-00" ) )
in
Soluntion

情景二(日期转数字):
let
Solution = Int64.From( Date.ToText( #date( 2020, 01, 31 ), "yyyyMMdd" ) )
in
Solution

情景三(文本转日期):
let
Solution = Date.From( Text.Combine( List.Reverse( Text.Split( "31.01.2020", ".") ), "-" ) )
in
Solution

情景四(日期转文本):
= Date.ToText( #date( 2020, 01, 31), "dd.MM.yyyy" )

情景五(文本短日期转日期):
let
fnTextToDate =
( DateInText as text, Century as number ) =˃
let
SplitByStop =
Text.Split(
DateInText,
"."
),
Transform =
List.Transform(
SplitByStop,
each Int64.From( _ )
),
Result =
#date(
Transform{2} + Century * 100,
Transform{1},
Transform{0}
)
in
Result
in
fnTextToDate("31.01.20", 20 )
情景六(日期转文本短日期):
= Date.ToText( #date( 2020, 01, 31), "dd.MM.yy" )

文本型的日期需要往“yyyy-mm-dd”的形式转换,因为只有这种形式不会因为计算机的日期制式产生歧义。
情景五中,倒数第三行代码中,20应改为Century.
已经改正,谢谢
文本值借助拆分、重组函数或者Text.Format向"yyyy-MM-dd"转换以便被Date.From精确识别;日期转数值则以文本格式过渡,整体堆砌去除分隔符,or转为日期对应的数字值。
情景三好像不需要那么复杂,用以下即可实现:
Solution =Date.FromText( "31.01.2020" ,[Format="dd.MM.yyyy"])
非常好的思路,谢谢分享