Date(Time).FromText/ToText

官方说明:

返回dateTime(即日期时间值dateTime)的文本表示形式。此函数采用一个可选格式参数format。有关支持的格式的完整列表,请参阅库规范文档。
DateTime.ToText( dateTime as nullable datetime, optional format as nullable text, optional culture as nullable text) as nullable text
 

解读:

标题简化了下,本文将介绍6个函数,分别为DateTime.FromTextDateTime.ToTextDate.FromTextDate.ToTextTime.FromTextTime.ToText
听名字就知道,这几个函数用于对日期时间和文本之间的相互转换,语法差不多,所以只放了其中一个说明,上面提到的库规范文档在这里

日期时间转文本:

第一参数为日期时间值,第二参数为需要格式化的格式。如现有日期时间为#datetime(2017,7,9,17,4,32),在PQ中显示为"2017/7/9 17:04:32",需要转成"2017年7月9日下午5时4分32秒"。
如果不知道这个函数你可能会分别取出每一个的值,然后用&连接得到结果,但是显然这样做太傻了。你可以直接这样= DateTime.ToText(#datetime(2017,7,9,17,4,32),"yyyy年M月d日tth时m分s秒")。没错,和DAX的format及工作表函数的text的用法差不多。需要注意的是,月(month)和分(minute)缩写都是m,所以为了区分,大写M代表月,小写m代表分。
第三参数为区域选项,比如写成= DateTime.ToText(#datetime(2017,7,9,17,4,32),null,"zh-cn"),返回的是按照我们中国人习惯的"2017/7/9 17:04:32";而如果写成= DateTime.ToText(#datetime(2017,7,9,17,4,32),null,"en-us")则返回的是按照美国人习惯的"7/9/2017 5:04:32 PM",当然还有其他区域,如果省略则默认为系统当前区域。
举几个栗子:

dt= #datetime(2017,7,9,17,4,32),
a= DateTime.ToText(dt,"yyyy/MM/ddThh:mm:ss"),                  //"2017/07/09T05:04:32"
b= DateTime.ToText(dt,"yyyy-MM-dd"),                           //"2017-07-09"
c= DateTime.ToText(dt,"yyyy啊MM啊dd啊"),                        //"2017啊07啊09啊"
d= DateTime.ToText(dt,"yy年M月d日"),                            //"17年7月9日"
e= DateTime.ToText(dt,"yy年M月d日 dddd"),                       //"17年7月9日 星期日"
f= DateTime.ToText(dt,"yy年M月d日 ddd"),                        //"17年7月9日 周日"
g= DateTime.ToText(dt,"y年MMMM"),                              //"17年七月"
h= DateTime.ToText(dt,"y年MMMM","en-us"),                      //"17年July"
i= DateTime.ToText(dt,"MMM yyyy","en-us"),                     //"Jul 2017"
j= DateTime.ToText(dt,"MMM yyyy dddd","en-us"),                //"Jul 2017 Sunday"
k= DateTime.ToText(dt,"MMM-dd yyyy ddd","en-us"),              //"Jul-09 2017 Sun"
l= DateTime.ToText(dt,"T"),                                    //"17:04:32"
m= DateTime.ToText(dt,"t"),                                    //"17:04"
n= DateTime.ToText(dt,"tt"),                                   //"下午"
o= DateTime.ToText(dt,"tt h:m:s"),                             //"下午 5:4:32"
p= DateTime.ToText(dt,"h:m:s tt","en-us")                      //"5:4:32 PM"
q= DateTime.ToText(dt,"HH:mm:ss")                              //"17:04:32"

看到这应该能了解各个字母及不同数量分别代表的意思,Date.ToTextTime.ToText同上就不一一介绍了。
可搭配出的组合远不止以上几种,请自行测试。
 

文本转日期时间:

往往从系统导出的数据都是文本格式,如果格式规范PQ一般能自动识别并更改类型,但是免不了有些不规范格式会识别不了,这时候就可以尝试下FromText。
因为转成日期时间格式不需要格式化,所以只需要两个参数:第一参数为文本格式的日期时间,第二参数为区域选项。
继续看栗子,我们把刚才转换的文本格式再反过来,并又加了几条试试:

其中大部分都可以识别,大致可以从中总结出以下规律:

  • 如果指代不明则识别不了,比如"201711",系统无法识别其中的11到底是1月1日还是11月
  • 如果格式正确但没有提供值则默认为最小值,比如"Jul 2017"默认显示为"2017/7/1 00:00:00",日期为1,时间为0
  • 以上两条都是猜的。。。请自行尝试

注意图中最后一条,"20170709050432",按理说应该可以识别啊可是为什么显示Error呢?
原来标准的格式在日期和时间之间有一个T,为"20170709T050432",所以得先在文本中间插入一个T:= DateTime.FromText(Text.Insert("20170709050432",8,"T")),这样就能正确的返回结果了。

2 Replies to “Date(Time).FromText/ToText”

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注